質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.37%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

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

FFmpeg

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

Q&A

解決済

1回答

617閲覧

FFMpegCoreを使って正確に処理の進行状況をパーセンテージで表示させる方法

samidare_chan

総合スコア18

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

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

FFmpeg

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

0グッド

0クリップ

投稿2024/05/09 10:08

質問内容

提示コードですが///コメント部内部のコードでTimeSpan構造体を使って動画のエンコード処理の正確なパーセンテージで算出方法が知りたいです。

知りたいこと

TimeSpan構造体を使って動画のエンコードの進行状況をパーセンテージで算出したいです。

現状の問題

ChatGPTで回答を得たのですが、自分はマルチスレッドに対応したいので実行時間の多い時、少ない時で処理の完了までにかかる予想時間が異なるので下記のChatGPTは正直参考になりません

ChatGPT回答

cs

1static Action<TimeSpan> progressHandler = new Action<TimeSpan>(p => 2{ 3 // 前提として、処理の完了時間もわかっている必要があります 4 TimeSpan totalDuration = TimeSpan.FromSeconds(10); // 例として10秒の処理を想定 5 6 // 経過時間の割合を算出してパーセンテージに変換 7 double progressPercentage = (p.TotalMilliseconds / totalDuration.TotalMilliseconds) * 100; 8 9 // パーセンテージを整数値に変換して表示 10 Console.WriteLine($"進行状況: {progressPercentage:F2}%"); 11}); 12 13public static async Task ConvertVideoAsync(string inputFilePath, string outputFilePath) 14{ 15 try 16 { 17 var ffmpeg = FFMpegArguments 18 .FromFileInput(inputFilePath) 19 .OutputToFile(outputFilePath, false, options => options 20 .ForceFormat("mp4") 21 .WithVideoCodec(VideoCodec.LibX264) 22 .WithAudioCodec(AudioCodec.Aac)).NotifyOnProgress(progressHandler); 23 24 await ffmpeg.ProcessAsynchronously(); 25 } 26 catch(Exception ex) 27 { 28 Console.WriteLine(ex.Message); 29 } 30} 31

ここでは、progressHandler関数内で与えられたTimeSpan(処理の経過時間)と、処理の完了までにかかる予想時間(totalDuration)を用いて、処理の進行状況を計算しています。TimeSpanは経過時間を表すため、処理の進行状況をパーセンテージで表示するのに適しています。

調べたこと

ChatGPT,gemini等のAIに質問
.NotifyOnProgress(): https://www.fuget.org/packages/FFMpegCore/4.2.0/lib/netstandard2.0/FFMpegCore.dll/FFMpegCore/FFMpegArgumentProcessor?code=true#M%3AFFMpegCore.FFMpegArgumentProcessor.NotifyOnProgress%28System.Action%7BSystem.Double%7D%2CSystem.TimeSpan%29

TimeSpan構造体: https://learn.microsoft.com/ja-jp/dotnet/api/system.timespan?view=net-8.0

利用ライブラリ

FFMpegCore(NuGet): https://github.com/rosenbjerg/FFMpegCore

提示コード(全文)

cs

1using FFMpegCore; 2using FFMpegCore.Enums; 3using System.ComponentModel; 4 5 6class Program 7{ 8 static void Main() 9 { 10 Process(); 11 } 12 static async void Process() 13 { 14 var task = ConvertVideoAsync("movie.MOV", "output.mp4"); 15 task.Wait(); 16 Console.WriteLine("end"); 17 } 18 19/////////////////////////////////////////////////////////////////////////////////// 20 static Action<TimeSpan> progressHandler = new Action<TimeSpan>(p => 21 { 22 //progress value from 0 to 100 23 Console.WriteLine(p); 24 }); 25/////////////////////////////////////////////////////////////////////////////////// 26 27 public static async Task ConvertVideoAsync(string inputFilePath, string outputFilePath) 28 { 29 try 30 { 31 TimeSpan time; 32 var ffmpeg = FFMpegArguments 33 .FromFileInput(inputFilePath) 34 .OutputToFile(outputFilePath, false, options => options 35 .ForceFormat("mp4") 36 .WithVideoCodec(VideoCodec.LibX264) 37 .WithAudioCodec(AudioCodec.Aac)).NotifyOnProgress(progressHandler); 38 await ffmpeg.ProcessAsynchronously(); 39 40 } 41 catch(Exception ex) 42 { 43 Console.WriteLine(ex.Message); 44 } 45 } 46}

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

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

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

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

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

fiveHundred

2024/05/09 11:18

FFMpegCoreで「どこまで処理が終わったか」を取得する方法はありますか? (例えば、動画x秒のうちy秒のエンコードが終わった、など)
YAmaGNZ

2024/05/09 11:29 編集

進捗率はpなのではないですか? Action<double> progressHandler = new Action<double>(p => { //progress value from 0 to 100 Debug.WriteLine(p); }); で取れそうですけど
guest

回答1

0

ベストアンサー

調べてみたところ、引数pは「動画時間x秒のうちp秒の処理が終わった」というもののようです。
その動画時間x秒はテストコードを見た限り、FFProbe.Analyse("ファイルパス").Durationで取得するようになっているようです。

ただ、あなたが使っているNotifyOnProgress(Action<TimeSpan> onTimeProgress)ではなく、NotifyOnProgress(Action<double> onPercentageProgress, TimeSpan totalTimeSpan)のほうが直接パーセンテージが得られるのでこちらの方がいいでしょう(対象コード)。

まとめると、以下のようになると思います(動作未確認なので、エラーなどは適宜修正してください)。

C#

1 static Action<double> progressHandler = new Action<double>(p => // TimeSpanではなくdoubleを指定 2 { 3 //progress value from 0 to 100 4 Console.WriteLine(p); 5 }); 6 7 public static async Task ConvertVideoAsync(string inputFilePath, string outputFilePath) 8 { 9 try 10 { 11 var analysis = FFProbe.Analyse(inputFilePath); // 動画全体の時間などを取得 12 13 var ffmpeg = FFMpegArguments 14 .FromFileInput(inputFilePath) 15 .OutputToFile(outputFilePath, false, options => options 16 .ForceFormat("mp4") 17 .WithVideoCodec(VideoCodec.LibX264) 18 .WithAudioCodec(AudioCodec.Aac)).NotifyOnProgress(progressHandler, analysis.Duration); // 動画全体の時間を引数に設定 19 await ffmpeg.ProcessAsynchronously(); 20 21 } 22 catch(Exception ex) 23 { 24 Console.WriteLine(ex.Message); 25 } 26 }

投稿2024/05/09 11:41

fiveHundred

総合スコア10130

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問