В последнее время я дергал себя за волосы с помощью командной строки FFmpeg. Знайте, что я не эксперт FFmpeg. Вот моя проблема:

У меня есть куча изображений YUV422 как таковых:

image0.yuv
image1.yuv
..
image450.yuv

Наряду с этим у меня есть файл, содержащий метки времени для каждого изображения, скажем:

timestamps.txt

Я хотел бы закодировать видео без потерь (возможно, с -c:v libx264 -pix_fmt yuv422p) из них, чтобы каждое изображение отображалось в правильной отметке времени. Вот что я попробовал напрасно:

  • используйте -f concat и предоставьте файл, содержащий список, подобный этому:

    file 'image0.yuv'
    duration '0.0515'
    file 'image0.yuv'
    duration '0.0721'
    ... etc
    

    это решение не работает, потому что мне нужно предоставить размер кадра (который не включен в необработанные файлы yuv)

  • что-то вроде cat *.yuv | ffmpeg -f rawvideo -s 800x600 -pix_fmt yuv422p -framerate 0.5 -i - -c:v libx264 -pix_fmt yuv422p out.mp4 который не работает ни потому, что я не могу предоставить ему временные метки для каждого изображения (переменная частота кадров), но просто использовать фиксированный аргумент -framerate

  • Я знаю об аргументе -vsync vfr но не могу заставить его работать должным образом

Буду вечно благодарен за любой совет, спасибо :)

1 ответ1

1

Невозможно указать общие параметры ввода для демона concat. Быстрый и грязный обходной путь: конвертируйте все изображения YUV во что-то, что можно прочитать, не указывая дополнительных параметров. Например:

for f in *.yuv; do ffmpeg -f rawvideo -s 320x240 -pix_fmt yuv422p -i "$f" "${f%%.yuv}.avi"; done

Затем вместо этого создайте свой файл concat с файлами AVI.

Или с GNU parallel:

parallel 'ffmpeg -f rawvideo -s 320x240 -pix_fmt yuv422p -i {} {.}.avi' ::: *.yuv

Или используйте метод, связанный с комментариями, в котором вы можете передать YUV-изображения и позже изменить временные метки CFR сгенерированного файла, чтобы они стали VFR.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .