我刚刚学习如何在几小时前使用ffmpeg生成视频缩略图。
这些是一些结果:
我使用与Youtube相同的尺寸(宽度 - 高度)。每张图片包含最多25张缩略图(5x5),大小为160x90。
一切看起来都很好,直到:
public async Task GetVideoThumbnailsAsync(string videoPath, string videoId)
{
byte thumbnailWidth = 160;
byte thumbnailHeight = 90;
string fps = "1/2";
videoPath = Path.Combine(_environment.WebRootPath, videoPath);
string videoThumbnailsPath = Path.Combine(_environment.WebRootPath, $"assets/images/video_thumbnails/{videoId}");
string outputImagePath = Path.Combine(videoThumbnailsPath, "item_%d.jpg");
Directory.CreateDirectory(videoThumbnailsPath);
using (var ffmpeg = new Process())
{
ffmpeg.StartInfo.Arguments = $" -i {videoPath} -vf fps={fps} -s {thumbnailWidth}x{thumbnailHeight} {outputImagePath}";
ffmpeg.StartInfo.FileName = Path.Combine(_environment.ContentRootPath, "FFmpeg/ffmpeg.exe");
ffmpeg.Start();
}
await Task.Delay(3000);
await GenerateThumbnailsAsync(videoThumbnailsPath, videoId);
}
我遇到了麻烦:
await Task.Delay(3000);
当我学习使用ffmpeg的方法时,他们没有提及它。几个小时后失败了,我注意到了:
mp4视频(1分31秒 - 1.93Mb)需要一些延迟时间~1000ms。另外,mp4视频(1分49秒 - 7.25Mb)需要一些延迟时间~3000ms。
如果我不使用Task.Delay
并尝试立即获取所有文件,它将返回0(目录中没有文件)。
另外,每个与其他文件长度不同的文件需要不同的延迟时间。我不知道如何计算它。
我的问题是:如何检查任务何时完成?
P / s:我不是要与javascript相关,但在js中,有一些名为Promise
的东西:
var promise = new Promise(function (done) {
var todo = function () {
done();
};
todo();
});
promise.then(function () {
console.log('DONE...');
});
我想编辑那样的代码。
谢谢!
答案 0 :(得分:0)
如果你想同步执行,那么你可以调用ffmpeg.WaitForExit(),这将导致行等待直到进程完成。否则,您需要启动任务以在后台运行它。 C#任务有点类似于JavaScript中的Promise。