Вопрос или проблема
Я пытаюсь объединить несколько видеофайлов и у меня возникла проблема. Я свёл проблему к следующему минимальному рабочему примеру. Я создаю 2-секундный mp4 с бесшумной аудиопотоком:
$ ffmpeg -f lavfi -i anullsrc -c:a aac -t 2 a.mp4
Затем я создаю файл, содержащий имена файлов для конкатенации:
$ cat videos.txt
file a.mp4
file a.mp4
После этого я объединяю видео:
$ ffmpeg -f concat -i videos.txt -c copy combine.mp4
что вызывает у меня следующее предупреждение:
[mp4 @ 0x638776cb5a80] Ненормативный DTS в выходном потоке 0:0; предыдущий: 89088, текущий: 88200; изменение на 89089. Это может привести к неправильным временным меткам в выходном файле.
Как правильно создать аудиофайл, чтобы не получать эти предупреждения?
Сначала измените контейнер на matroska
, установив TS в ноль.
for file in *.mp4; do filename="${file%.*}"; ffmpeg -i "$filename".mp4 -c copy -avoid_negative_ts make_zero "$filename".mkv; done
Затем выполните конкатенацию.
У вас не будет единой ошибки после того, как они станут .mkv
.
Я только что понял, что могу избежать этого предупреждения, просто создав первый файл в формате mkv вместо mp4:
$ ffmpeg -f lavfi -i anullsrc -c:a aac -t 2 a.mkv
Ответ или решение
Проблема, с которой вы столкнулись, связана с предупреждением о "некорректной DTS" (DTS – Decoding Time Stamp), возникающим при объединении идентичных аудиофайлов с использованием FFmpeg. Это предупреждение появляется из-за того, что у обоих файлов одна и та же временная метка, что вызывает конфликт при конкатенации. Давайте рассмотрим несколько способов устранения этой проблемы.
Способ 1: Использование формата Matroska (MKV)
Одним из простых решений является создание файла в формате MKV вместо MP4 прямо с момента его генерации. MKV обрабатывает временные метки несколько иначе и обычно не вызывает этой проблемы. Вот пример команды:
$ ffmpeg -f lavfi -i anullsrc -c:a aac -t 2 a.mkv
После этого, вы можете объединять MKV файлы как обычно. Создав файл videos.txt
, как вы уже делали:
file a.mkv
file a.mkv
И затем выполните команду конкатенации:
$ ffmpeg -f concat -i videos.txt -c copy combine.mkv
Способ 2: Подготовка MP4 с нулевой временной меткой
Если вы хотите сохранить формат MP4, то вы можете подготовить файлы с нулевой временной меткой перед конкатенацией. Для этого используйте следующую команду:
for file in *.mp4; do filename="${file%.*}"; ffmpeg -i "$filename".mp4 -c copy -avoid_negative_ts make_zero "$filename"_fixed.mp4; done
Эта команда создаст новые MP4 файлы с исправленными временными метками, которые затем можно использовать для конкатенации без возникновения предупреждений.
После этого дополните файл videos.txt
с новыми файлами и выполните команду:
$ ffmpeg -f concat -i videos.txt -c copy combine.mp4
Заключение
Использование формата MKV или скорости устранения проблемы с временными метками MP4 позволяет избежать уведомлений о "несоответствующей DTS". В зависимости от ваших сценариев использования и требуемого результата, выберите самый подходящий для вас способ.