🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

Q&A

解決済

2回答

2550閲覧

C#で実行したFFmpegの出力結果をcsvファイルに書き込みたいがファイルが生成されない

alchatrus

総合スコア10

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

1グッド

0クリップ

投稿2019/11/18 23:15

前提・実現したいこと

C#のコードからFFmpegに指示を出し、出力結果を.csvファイルに書き込みます。
ソースコードでは与えられた二つの動画を元にPSNRを測定し、実行結果の出力先をcsvファイルに指定します。

発生している問題・エラーメッセージ

コードを実行すると、コード自体は問題なく動きますが、肝心のcsvファイルが作成されません。
C#からのファイル出力コマンドは受け付けないのか、それともソースコードに不備があるのか見つけられませんでした。
ちなみに直接コマンドプロンプトに同じコマンドを入力すると無事にファイルが生成されます。

該当のソースコード

C#

1// 実際に使っているのはSystem.Diagnosticsのみです 2using System; 3using System.IO; 4using System.Diagnostics; 5using System.Collections; 6 7namespace calclate_PSNR_and_input_values_into_csvFile 8{ 9 class Program 10 { 11 static void Main() 12 { 13 new Func().CalcPSNR(@"C:\Original.mp4", @"C:\Target.mp4", @"C:\PSNR.csv"); 14 } 15 } 16 17 public class Func 18 { 19 static readonly string FFmpegPath = @"E:\FFmpeg\ffmpeg\bin\ffmpeg.exe"; 20 21 public void CalcPSNR(string originalMoviePath, string targetMoviePath, string outputFilePath) 22 { 23 var arguments = $"-i {originalMoviePath} -i {targetMoviePath} -filter_complex psnr -f null - 2> {outputFilePath}"; 24 using (var process = new Process()) 25 { 26 process.StartInfo = new ProcessStartInfo 27 { 28 FileName = FFmpegPath, 29 Arguments = arguments, 30 CreateNoWindow = true, 31 UseShellExecute = false, 32 }; 33 process.Start(); 34 process.WaitForExit(); 35 } 36 } 37 } 38}

補足情報(FW/ツールのバージョンなど)

参考にさせていただいたサイト:
2つの映像の画質評価をする PSNR
MS-DOS 画面の出力をファイルに保存する
ffmpegを用いて動画から画像を取り出す【C#】

Windows 10 Home Var.1903
Visual Studio 2019

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/11/18 23:21

今までの質問がすべて放置されています。 解決済みの質問はベストアンサーを決めるか解決方法を自分で回答し、そうでない質問は回答者からの問い合わせに答えて質問を編集してください。
alchatrus

2019/11/18 23:45

ご指摘ありがとうございます。 過去に投稿した質問につきましてはどちらも解決済みにしました。
退会済みユーザー

退会済みユーザー

2019/11/19 01:13

> C#で実行したFFmpegの出力結果をcsvファイルに書き込みたい FFmpegの出力を得るところから始まってゼロから教えてほしいということですか? そうではなくて、現状でその「出力結果」は取得できていて、問題は CSV ファイルを作って「出力結果」をファイルに書き込むことなのですか? 後者の場合なら、具体的にどういうものでどういう形で取得できているか、それをどのような形で CSV 形式にしたいのかを詳しく書いてもらえるとレスが付きやすいと思います。 前者の場合は自分はお付き合いできませんが・・・
Zuishin

2019/11/19 12:21

-i オプションが二回指定されていますが、本当にコマンドプロンプトからなら成功しますか?
alchatrus

2019/11/19 14:39

> FFmpegの出力を得るところから始まってゼロから教えてほしいということですか? コマンドや出力結果の理解はできています。csvファイルがどういうものかも一定理解できています。ただ、なぜファイルが生成されないのかがわからないのです。 > -i オプションが二回指定されていますが、本当にコマンドプロンプトからなら成功しますか? "ffmpeg -i input1 -i input2 -filter_complex psnr -an -f null -" 上がffmpegでPSNRを測定するコマンドです。コマンドプロンプトで実行されることは確認済みです。
Zuishin

2019/11/19 14:41

input2 ではなくて targetMoviePath になってますよ。もう一度よく見直して齟齬がないようにしてください。
Zuishin

2019/11/19 14:42

その他のオプションも若干違います。
alchatrus

2019/11/19 15:10

input1 と input2 はそれぞれファイルの絶対パスです。 ffmpeg.exeはEドライブにインストールしましたので上のとおりになっています。 -an は動画から音声を消すコマンドです。使った二つの動画はいずれも音声抜きにしていますので不要かと思いました。
Zuishin

2019/11/19 22:53 編集

不要か不要でないかではなく、質問に書いてあることと実際のコードに齟齬があるので、情報が信頼できないということです。 cmd.exe を呼び出す方法は常套手段ですし、リダイレクトは cmd.exe の機能なので、回答者はみんなその解決法には気づいていますが、それだけですべての問題が解決するかどうかわからないので、そこだけを答えるか、別の問題も一緒に答えようとするかだけの違いです。
guest

回答2

0

ベストアンサー

変数argumentsに指定している標準出力のリダイレクト>や 標準エラー出力の2>はコマンドプロンプトの機能なので、このコマンドラインを踏襲するのであれば実行対象をffmpeg.exe ではなくcmd.exe とし、"/c" オプションをつけて起動させてください。

C#

1public void CalcPSNR(string originalMoviePath, string targetMoviePath, string outputFilePath) 2{ 3 var arguments = $"/c {FFmpegPath} -i {originalMoviePath} -i {targetMoviePath} -filter_complex psnr -f null - 2> {outputFilePath}"; 4 using (var process = new Process()) 5 { 6 process.StartInfo = new ProcessStartInfo 7 { 8 //FileName = FFmpegPath, 9 FileName = "cmd.exe", 10 Arguments = arguments, 11 CreateNoWindow = true, 12 UseShellExecute = false, 13 }; 14 process.Start(); 15 process.WaitForExit(); 16 } 17}

投稿2019/11/19 03:48

dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alchatrus

2019/11/19 15:11

頂いた関数に差し替えてじっこうしたところ無事にファイルが生成されました。ありがとうございます。
guest

0

argumentsでリダイレクトするようにしてますが、
ffmpegはリダイレクトを処理しません。

実行したプロセスの標準出力を取得する場合は、StandardOutputプロパティを使用して取得してください。

StandardOutput
この↑リファレンスにipconfigコマンドの標準出力を取得する例があるので参考にしてください。

投稿2019/11/19 03:25

Y.H.

総合スコア7918

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alchatrus

2019/11/19 15:14

頂いた案での実行も無事に成功しました。ありありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問