Вопрос или проблема
Я использую FFmpeg concat для объединения нескольких файлов ts. Я использую следующую команду
ffmpeg -y -f concat -i filelist.txt -c copy output.mkv
Все пути к файлам ts указаны в filelist.txt
, чаще всего это работает хорошо, но при обработке некоторых файлов ts FFmpeg выдает следующие ошибки
[matroska @ 044bf9c0] В метке отсутствуют временные метки для потока 0. Это устарело и в будущем перестанет работать. Исправьте свой код, чтобы правильно устанавливать временные метки
[matroska @ 044bf9c0] Невозможно записать пакет с неизвестной временной меткой
av_interleaved_write_frame(): Неверный аргумент
Я полагаю, что ошибка вызвана отсутствием временных меток в этих файлах ts? Но поскольку сообщение об ошибке говорит “устарело и в будущем перестанет работать в будущем.”
Итак, мой вопрос в настоящее время: есть ли способ или некоторые флаги команд FFmpeg, чтобы подавить эту ошибку и просто объединить эти файлы ts без повторного кодирования?
Добавьте -fflags +genpts
к команде FFmpeg. Например:
ffmpeg -fflags +genpts -i foo.avi -c:v copy -c:a copy foo.mp4
Ответ или решение
Как справиться с ошибкой "FFmpeg: незнакомые временные метки"?
При работе с FFmpeg для объединения нескольких TS файлов с помощью команды concat
, может возникнуть ошибка, связанная с временными метками. Это может выглядеть следующим образом:
[matroska @ 044bf9c0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[matroska @ 044bf9c0] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument
Эта ошибка указывает на то, что некоторые пакеты в TS файлах не имеют заданы временные метки. Хотя ошибка говорит о том, что это "устаревшая" функция, и в будущем это может перестать работать, важно понимать, как сейчас можно решить проблему. Рассмотрим возможные решения подробнее.
Причины ошибки
Ошибки, связанные с временными метками, чаще всего возникают из-за:
- Неустановленных временных меток в исходных TS файлах.
- Неправильного формата или коррумпированных данных в файлах.
- Использования файлов, созданных с помощью другого видео-кодировщика, который может не указывать временные метки корректно.
Решение проблемы
Для решения проблемы, не прибегая к повторной кодировке видео, можно использовать флаг -fflags +genpts
. Этот флаг заставляет FFmpeg генерировать временные метки для потоков, которые их не имеют. Пример команды выглядит следующим образом:
ffmpeg -y -fflags +genpts -f concat -i filelist.txt -c copy output.mkv
Здесь мы добавили -fflags +genpts
в ваш исходный код. Это действие позволит игнорировать ошибки, связанные с отсутствием временных меток, и продолжить процесс объединения файлов.
Дополнительные рекомендации
-
Проверка исходных файлов: Убедитесь, что все TS файлы корректны и не повреждены. Для этого можно использовать команду
ffmpeg -i yourfile.ts
, чтобы увидеть отчет об ошибках. -
Создание временных меток при помощи
-itsoffset
: Если проблема заключается в определенном файле, вы можете рассмотреть вариант использования опции-itsoffset
, чтобы скорректировать временные метки при объединении. -
Заблаговременная обработка файлов: Если вы прогнозируете, что некоторые файлы могут не содержать временные метки, вы можете сначала использовать FFmpeg для их обработки с помощью
-fflags +genpts
, а затем объединить уже исправленные файлы.
Заключение
Несмотря на то, что ошибка связана с отсутствием временных меток, с помощью добавления флага -fflags +genpts
вы можете без особых проблем объединить ваши TS файлы. Важно помнить, что это решение может временно обойти проблему, но не гарантирует ее устранение в будущих версиях FFmpeg. Чтобы избежать подобных ошибок в будущем, рекомендую регулярно проверять и обрабатывать медиафайлы.
Использование вышеуказанных методов не только упростит вашу работу с видеофайлами, но и повысит качество конечных результатов.