ffmpeg -ss, затем примените фильтр, затем concat, создав ошибки отметки времени - PullRequest
0 голосов
/ 06 августа 2020

Используя ffmpeg, я разделил файл на несколько частей с помощью -ss. Затем я применяю фильтр к некоторым файлам, затем объединяю файлы вместе. Когда я это делаю, я получаю: Немонотонный DTS в выходном потоке 0: 0; предыдущая: 341334, текущая: 340526; меняется на 341335. Это может привести к неправильным отметкам времени в выходном файле. Выходной файл воспроизводится, но есть заметные пропуски в местах соединения файлов.

Вот как я делю файл:

ffmpeg -i full_source.mp4 -ss 0 -to 14.264250 -c copy  01-plain.mp4
ffmpeg -i full_source.mp4 -ss 14.264250 -to 18.435083 -c copy  01-filtered.mp4

ffmpeg -i full_source.mp4 -ss 18.435083 -to 29.988292 -c copy  02-plain.mp4
ffmpeg -i full_source.mp4 -ss 29.988292 -to 31.865167 -c copy  02-filtered.mp4
...
ffmpeg -i full_source.mp4 -ss 0 -to 14.264250 -c copy  10-plain.mp4
ffmpeg -i full_source.mp4 -ss 234.484203 -to 300.000 -c copy  10-filtered.mp4

Затем я применяю разные фильтры рисованного текста для каждого из 10 отфильтрованных файлов и сохраняю их под новым именем, например:

ffmpeg -hide_banner -loglevel warning -y -i 01-filtered.mp4 -filter_complex "drawtext=fontfile=calibri.ttf:fontsize=24:fontcolor=white:x=300:y=500:text='hello world'" -crf 15 01-filtered-complete.mp4

Наконец, я снова объединяю все простые и полные файлы вместе следующим образом:

ffmpeg  -f concat -safe 0 -i mylist.txt -c:a copy -c:v copy  outfile.mp4

И вот где появляется ошибка времени. Я пробовал добавить -vsyn c drop в команду concat, но это тоже не сработало. Та же версия ffmpeg выполняет разделение, фильтр и объединение. Я пробовал разные версии, все от 20170519 до майской 2020 с тем же результатом. Всегда проверяйте, что все три шага выполняются одной и той же версией ffmpeg.

Единственное, что я вижу, это то, что ffprobe показывает продолжительность 14,27 для 01-plain.mp4, тогда как она должна быть 14,264250. Все остальные файлы показывают аналогичную разницу в округлении. Файлы - 23,98 кадра в секунду. Если я выполняю все свои фильтры в очень длинной команде, не разбивая файл, я могу без проблем использовать более точные числа. Просто это занимает в 10 раз больше времени. Это все по сценарию, это происходит пару сотен раз в день, и время - деньги, поэтому я не могу тратить в 10 раз больше времени на создание каждого файла.

Есть идеи? Заранее спасибо!

...