質問内容
提示コードですが///
コメント部内部のコードで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}
回答1件
あなたの回答
tips
プレビュー