Как проверить, когда ffmpeg завершает задачу? - PullRequest
0 голосов
/ 25 мая 2018

Я только учусь, как использовать 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,93 Мб) требуется некоторое время задержки ~ 1000 мс.И другое, для видео в формате mp4 (1 мин 49 с - 7,25 Мб) требуется некоторое время задержки ~ 3000 мс.

Если я не использую 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 голосов
/ 25 мая 2018

Если вы хотите сделать это синхронно, то вы можете вызвать ffmpeg.WaitForExit (), что заставит строку ждать до завершения процесса.В противном случае вам нужно будет запустить задачу, чтобы запустить ее в фоновом режиме.Задача AC # чем-то похожа на Promise в JavaScript.

Этот ответ также можно использовать для получения подробной информации о том, как обернуть WaitForExit, чтобы вы могли использовать его с await

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...