ffmpeg – объединение идентичных аудиофайлов без видео приводит к предупреждению “некондиционный DTS”

Вопрос или проблема

Я пытаюсь объединить несколько видеофайлов и у меня возникла проблема. Я свёл проблему к следующему минимальному рабочему примеру. Я создаю 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". В зависимости от ваших сценариев использования и требуемого результата, выберите самый подходящий для вас способ.

Оцените материал
Добавить комментарий

Капча загружается...