Итак, я пытаюсь извлечь каждый кадр видео, затем с помощью ffprobe посмотреть, когда каждый кадр воспроизводится в видео, а затем соединить это видео вместе, используя эти извлеченные изображения и вывод ffprobe.
Сейчас у меня есть этот командный файл:
for %%a in (*.mp4) do (
mkdir "%%~na_images" > NUL
ffmpeg.exe -hide_banner -i "%%a" -t 100 "%%~na_images\image-%%d.png"
ffprobe.exe "%%a" -hide_banner -show_entries frame=coded_picture_number,best_effort_timestamp_time -of csv > "%%~na_frames.txt"
)
Сначала создается каталог для изображений.
Затем ffmpeg извлекает все кадры видео в отдельные файлы PNG, которые нумеруются соответствующим образом.
Наконец, ffprobe видит, когда каждый кадр впервые показывается в этом видео (IE: кадр 1 отображается с 0 секундами, но, скажем, со скоростью 60 кадров в секунду, затем кадр 2 воспроизводится с 0,016667 секундами в видео). Вывод выглядит так:
frame,0.000000,0
frame,0.000000
frame,0.017000,1
frame,0.023220
Где первое число (IE 0,17000 - время появления второго кадра), а второе число - номер кадра.
Теперь моя проблема заключается в использовании ffmpeg, чтобы взять каждый кадр и поместить его в нужное время в видео. Я могу сделать это, используя другой язык (возможно, Python), но мое лучшее предположение - сделать цикл для перебора выходного файла ffprobe, получить время кадра и номер изображения, поместить этот кадр в те точки, в которых он появляется, и затем двигаться дальше до следующего кадра и времени размещения. Если посмотреть на данные фрейма, которые я использовал в качестве примера выше, это будет что-то вроде этого:
for line in lines:
mySplit = line.split(',')
# Get image number 0 and insert at time 0.000000
Это та часть, которую я не знаю, как сделать в смысле кодирования. Я могу прочитать и проанализировать строки выходного текстового файла ffprobe, но я не знаю, как вставить кадры в определенные моменты видео, используя ffmpeg или аналогичные решения.