Используя 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 раз больше времени на создание каждого файла.
Есть идеи? Заранее спасибо!