如何检查ffmpeg何时完成任务?

时间:2018-05-25 19:03:22

标签: c# ffmpeg

我刚刚学习如何在几小时前使用ffmpeg生成视频缩略图。

这些是一些结果:

1

2

我使用与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...');
});

我想编辑那样的代码。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果你想同步执行,那么你可以调用ffmpeg.WaitForExit(),这将导致行等待直到进程完成。否则,您需要启动任务以在后台运行它。 C#任务有点类似于JavaScript中的Promise。

This answer can also be used for details on how to wrap WaitForExit so that you can use it with an await