Я только учусь, как использовать 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,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...');
});
Я хочу отредактировать код следующим образом.
Спасибо!