Вопрос или проблема
При преобразовании видео с помощью FFmpeg 7.1 (недавно) я хочу не только конвертировать основной видеопоток, но и копировать обложку, которая хранится как MJPEG “видеопоток”. Например:
Stream #0:5: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 640x360, 90k tbr, 90k tbn (attached pic)
Metadata:
filename : cover.jpg
mimetype : image/jpeg
Основываясь на примере, я полагаю, что 0:v:m:codec=mjpeg
должен определить такой поток, но команда вроде ffmpeg -i "in.mkv" -map 0:v:0 -c:v:0 libx265 -map 0:v:m:codec=mjpeg? -c:v copy "out.mkv"
выдает эту ошибку:
Stream map '' matches no streams.
To ignore this, add a trailing '?' to the map.
Failed to set value '0:v:m:codec=mjpeg?' for option 'map': Invalid argument
Error parsing options for output file Out.mkv.
Error opening output files: Invalid argument
Я подумал, что, возможно, моя сборка FFmpeg не поддерживает выбор потоков по codec
, поэтому я попробовал другие маппинги с m
, такие как -map 0:v:m:frame_rate=24/1
и -map 0:m:language:spa
(похоже на этот пример из официальной документации) и они все выдают мне ту же ошибку. Может ли быть, что моя сборка вообще не поддерживает m
?
Преобразование обложки вместе с видео происходит по умолчанию, вам не нужно делать никакой маппинг для этого, просто используйте базовую команду:
ffmpeg -i input.mkv -c:v libx265 -c:a copy output.mkv
Однако в Windows 11 есть проблема с распознаванием миниатюр из видео, использующих кодек h.265: они отображаются в виде значка по умолчанию, но вы можете увидеть миниатюру, если открыть видео с помощью VLC player и нажать CTRL + I, например, или если вы скопируете видео на систему Linux.
Ответ или решение
Ошибка, с которой вы столкнулись при использовании FFmpeg для копирования обложки видео при конвертации, может быть связана с тем, что ваша версия FFmpeg не поддерживает использование маппинга на основе метаданных, например, m
, для определенных параметров, таких как codec
.
Теория:
FFmpeg позволяет маппировать потоки с помощью параметра -map
, что предоставляет гибкость в выборе, какие потоки вы хотите обрабатывать или копировать в файл вывода. В вашем случае вы пытаетесь использовать изощренный маппинг для выбора MJPEG потока на основе его кодека. Однако на практике это может не работать, если ваша сборка FFmpeg не поддерживает такие параметры. Параметры m
для маппинга действительно существуют, но их применение зависит от конкретной сборки и версии программы.
Пример:
Ваш пример команды:
ffmpeg -i "in.mkv" -map 0:v:0 -c:v:0 libx265 -map 0:v:m:codec=mjpeg? -c:v copy "out.mkv"
Выдает ошибку из-за некорректного синтаксиса и, возможно, неподдерживаемых параметров. В вашем случае оператор m
и подкоманды, такие как codec
, возможно не функционируют так, как предполагается.
Применение:
Ваша задача по сути проще, чем вы предполагали. Если вы просто хотите конвертировать основное видео и сохранить обложку, это обычно делается без сложного маппинга. Используйте команду:
ffmpeg -i input.mkv -c:v libx265 -c:a copy output.mkv
Эта команда указывает FFmpeg конвертировать видео поток с использованием кодека libx265 и копировать все другие потоки (включая аудио и обложки) в файл вывода без изменений. Если обложка указана как attached pic
, она автоматически будет скопирована, если это поддерживается вашим файлом вывода и используемыми кодеками.
Дополнительное Примечание:
Убедитесь, что ваша версия FFmpeg обновлена и имеет все необходимые компоненты, потому что функциональность может различаться в зависимости от опций, которые были включены при компиляции. Если программа все еще не функционирует должным образом, вы можете попытаться использовать более простой синтаксис или обновить версию FFmpeg. Вдобавок, стоит учитывать, что Windows 11 может иметь проблемы с отображением эскизов видео, использующих h.265, вне VLC Player.