Вопрос или проблема
Я пытаюсь закодировать видео с помощью ffmpeg
, к которому прикреплён файл обложки. Этот файл обложки также должен попасть в закодированное видео.
Я могу сделать это с помощью mkvextract attachments movie.mkv 1
&& <долгая команда кодирования ffmpeg>
&& mkvpropedit movie_new.mkv --add-attachment cover.jpg
. Оба, старый и новый, отображаются в mediainfo
с двумя строками
Cover : Yes
Attachments : cover.jpg
Но когда я пытаюсь интегрировать это в команду ffmpeg
, ffmpeg
настаивает на обнаружении второго видеопотока и либо отбрасывает его, либо кодирует его как второй видеопоток, что полностью сбивает с толку плеер.
Что я пробовал:
-map 0:t
–> ошибка, не могу найти вложения; -map 0:t?
–> выполняется и кодирует второй видеопоток
Все виды комбинаций -map
, даже тест прикрепления cover.jpg
при наличии видео movie_new.mkv
без обложки, вместе с отдельным cover.jpg
и ffmpeg -i movie_new.mkv -i cover.jpg ... -map 1 -map 0 -c copy -disposition:0 attached_pic
не работают.
Какие-нибудь идеи?
Исходный файл, похоже, имеет повреждённое вложение. Во время попыток конвертации заголовок ffmpeg
(или ffprobe
в общем) показывает:
Stream #0:7: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 640x360 [SAR 96:96 DAR 16:9], 90k tbr, 90k tbn (attached pic)
Metadata:
filename : cover.jpg
mimetype : image/jpeg
тогда как для созданного примера видео по предложению @rotem это
Stream #0:1: Attachment: none
Metadata:
filename : cover.jpg
mimetype : image/jpg
Последнее вложение работает с -map 0:t
, первое – нет, так как вложение не распознаётся. Возможно ли это исправить с помощью команды ffmpeg
?
Ответ или решение
Чтобы решить проблему интеграции обложки к видео-файлу с помощью FFmpeg, важно учитывать несколько ключевых аспектов—включение ненужного второго видеопотока, правильное назначение обложки и ее формат. Давайте рассмотрим, как вы можете справиться с этой задачей.
Подход к решению
1. Оценка состояния видео
Во-первых, вы упомянули о проблеме с извлечением обложки, которая может быть некорректно закодирована. FFmpeg распознает вашу обложку как видео поток (attached pic
), что может вызвать конфликты, когда вы пытаетесь ее снова добавить.
2. Проверка формата входного файла
Проверяемый вами файл имеет заголовок, который указывает на то, что FFmpeg видит обложку как отдельный поток. Необходимо убедиться, что при создании нового файла обложка не будет восприниматься как отдельный видеопоток.
3. Использование команд FFmpeg
Для правильного добавления обложки в конечный файл можно использовать следующую команду:
ffmpeg -i исходное_видео.mkv -i cover.jpg -map 0 -map 1 -c copy -disposition:1 attached_pic movie_new.mkv
Пояснение о каждом флаге
-i исходное_видео.mkv
: Указывает входной видеофайл.-i cover.jpg
: Указывает файл обложки.-map 0
: Используем все потоки из исходного видео.-map 1
: Добавляем обложку как новый поток.-c copy
: Копируем все потоки без перекодирования.-disposition:1 attached_pic
: Указываем, что поток обложки является рисунком для обложки.
Потенциальные проблемы и их решения
- Некорректное обнаружение обложки: Если FFmpeg все равно не распознает обложку, возможно, стоит использовать другую обложку для тестирования, чтобы увериться, что проблема не в исходном файле.
- Обработка потоков: Если у вас все еще возникают конфликты с неподходящими видеопотоками, вы можете использовать
-map
для явного выбора нужных потоков.
Заключение
Если предложенная команда не привела к желаемому результату, это может указывать на несовместимость кодеков или другие внутренние ошибки в бурном виде фреймов. В таком случае вы можете попробовать перекодировать ваш исходный файл в другой формат перед добавлением обложки.
Убедитесь, что вы используете последнюю версию FFmpeg, так как новые обновления могут улучшить поддержку работы с вложениями и общую производительность.
Следуя этим рекомендациям, вы сможете успешно интегрировать обложку в ваше видео.