
コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。
参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutpu …
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコードです。
※a.m4aをa.mp3に320kbpsのビットレートで変換するコマンドになります。
現状をまとめると以下のようになります。
(1)コマンドプロンプトを手動で起動して、以下のコマンドを打ち込むとうまく変換してくれる。
"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
(2)しかしこのコマンドを下記のコードで実行すると処理が行われない。
(3)そうなると下記のコード自体に問題があるように思われるが、
下記のコードで"dir c:\"など簡単なコマンドを実行すると成功する。
ダブルクオテーション(")やスペースなどに問題があるのかと思いいろいろと試してみましたがダメでした。
どうすれば下記のコードで"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"のようなコマンドを実行出来るのでしょうか?
実行する方法、もしくは違うコードで実行する方法などを知っておられる方、ぜひご教授ください!非常に困っております。
---------------------------------------------------------------------------------------------------
■コマンドプロンプトをC#上から実行するコード
http://dobon.net/vb/dotnet/process/standardoutpu …のコードの丸写し
---------------------------------------------------------------------------------------------------
//Processオブジェクトを作成
System.Diagnostics.Process p = new System.Diagnostics.Process();
//ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
//出力を読み取れるようにする
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = false;
//ウィンドウを表示しないようにする
p.StartInfo.CreateNoWindow = true;
//コマンドラインを指定("/c"は実行後閉じるために必要)
//○成功する
p.StartInfo.Arguments = "dir c:\";
//×失敗する
p.StartInfo.Arguments = "\"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";
//起動
p.Start();
//出力を読み取る
string results = p.StandardOutput.ReadToEnd();
//プロセス終了まで待機する
//WaitForExitはReadToEndの後である必要がある
//(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit();
p.Close();
//出力された結果を表示
Console.WriteLine(results);
---------------------------------------------------------------------------------------------------
No.1ベストアンサー
- 回答日時:
>うまくいきません。
「なにが」「どう」「いまくいかない」んでしょうか?
プロセス起動した後に無反応になる?
プロセス終了した後に表示されるべきメッセージが表示されない?
プロセス起動できない?
起動したffmpeg.exeが終了しても戻ってこない?
参考ページではcmd.exeに/cオプションを指定しているようですが、
変更されたソースでは指定していないようで…。
その場合、
p.WaitForExit();
でちゃんと戻ってこれるんですかね?
# 起動したcmd.exe自体は終了していないはずですが…
# /Cも/Kも無かった場合ってどういう動作するんですかね?(Windows7 Pro 64Bitでcmd dirとしたら無視されてしまいましたが)
cmd.exe経由でなくても、必要条件満たせばffmpeg.exeの起動は可能と思いますよ。
ffmpeg.exeを利用するフロントエンドアプリなんかもそうしているでしょうし。
「ffmpeg.exe フロントエンド」で検索してみるとアプリは見つかるかと。
ご回答ありがとうございます。
私の説明がたりませんでしたね。追記で書かせていただきます。
上記のプログラムは
p.StartInfo.Argumentsに値を入れることでプロンプトにコマンドを入力して、p.Start()でプロンプトで処理を実行し、string results = p.StandardOutput.ReadToEnd();でその結果を読み取るものだと思います。
しかし
p.StartInfo.Arguments = "\"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";
と入力して実行すると、プロンプトは立ち上がるのですが、立ち上がるだけでコマンドが入力されないんです。ビルドすると未入力のコマンドプロンプトが立ち上がって処理が止まってしまう感じです。
/cは処理後にプロンプトを閉じるコマンドのようですので単純化するために除去しました、"dir c:\"だと成功するので必ずしも必要無いと思いました。
ちなみに以下のように/cをつけて実行するとエラーになりました。「ファイル名、ディレクトリ名、またはボリュームラベルの構文が間違っています」というエラーになりました。
p.StartInfo.Arguments = "/c \"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでDOSコマンドの複数実行
-
複数の処理の終了を待ちたい
-
c#でコマンドプロンプトを実行...
-
batファイルで立ち上げたaplを...
-
VB6のShell制御について
-
バッチファイル 特定ウインドウ...
-
EXCELをバッチコマンドで...
-
DOSから起動した際のSQLPLUSウ...
-
VBSでコマンドプロンプトのカレ...
-
64bitのwindowsサーバーで32bit...
-
秀丸でソフトをコマンドライン...
-
コマンドプロンプトの窓の起動...
-
【VB.NET】コマンドプロンプト...
-
VB.NETでコマンドプロンプトの操作
-
バッチファイルでAPを終了さ...
-
バッチへ値を返す
-
stable diffusionのインストー...
-
ExcelVBAにてアプリをタスクマ...
-
コマンドプロンプトの「%1」と...
-
コマンドプロンプトのエラーに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイル 特定ウインドウ...
-
EXCELをバッチコマンドで...
-
ExcelVBAにてアプリをタスクマ...
-
UWSCについて
-
batファイルで立ち上げたaplを...
-
VB.NETでDOSコマンドの複数実行
-
c#でコマンドプロンプトを実行...
-
Shiftキーを押しながら起動
-
バッチへ値を返す
-
gccがコマンドプロンプト上で使...
-
CreateProcessの制御について
-
64bitのwindowsサーバーで32bit...
-
stable diffusionのインストー...
-
プログラムを実行すると、なぜ...
-
VB.NETでコマンドプロンプトの操作
-
Visual basic6.0からショートカ...
-
バッチファイルからftpを実行時...
-
ASPからのEXEファイル起動
-
パスの件
-
VBSでコマンドプロンプトのカレ...
おすすめ情報