FFMPEG прикрепляет файл как метаданные

У меня есть набор изображений, которые я хочу преобразовать в видео с помощью ffmpeg. Следующая команда работает отлично:

ffmpeg -y -i frames/%06d.png -c:v huffyuv -pix_fmt rgb24 testout.mkv

У меня есть некоторые метаданные в двоичном файле, который я хочу добавить с видео. Я попытался сделать следующее, но это дает мне ошибку:

ffmpeg -y -i frames/%06d.png -c:v huffyuv -pix_fmt rgb24 -attach mybinaryfile -metadata:s:2 mimetype=application/octet-stream testout.mkv

Это ошибка:

[matroska @ 0x656460] Codec for stream 1 does not use global headers but container format requires global headers
[matroska @ 0x656460] Attachment stream 1 has no mimetype tag and it cannot be deduced from the codec id.
Output #0, matroska, to 'testout.mkv':
  Metadata:
    encoder         : Lavf56.33.101
    Stream #0:0: Video: huffyuv (HFYU / 0x55594648), rgb24, 640x640, q=2-31, 200 kb/s, 25 fps, 1k tbn, 25 tbc
    Metadata:
      encoder         : Lavc56.39.100 huffyuv
    Stream #0:1: Attachment: none
    Metadata:
      filename        : 2ceb-1916-56bb-3e10
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> huffyuv (native))
  File 2ceb-1916-56bb-3e10 -> Stream #0:1
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument

Было бы замечательно, если кто-нибудь может объяснить мне, что я делаю неправильно:)

Ответ 1

Необходимо правильно указать поток

Пример:

ffmpeg -y -i frames/%06d.png -c:v huffyuv -pix_fmt rgb24 -attach mybinaryfile \
-metadata:s:t mimetype=application/octet-stream testout.mkv

Эта команда установит метаданные для всех потоков вложения (t) (s). Если у вас несколько вложений, а метаданные разные, тогда вам нужно быть более конкретными, например:

-metadata:s:t:0 mimetype=text/plain \
-metadata:s:t:1 mimetype=application/gzip

Это установит метаданные для первого вложения как mimetype=text/plain, а второе - как mimetype=application/gzip. Помните, что индекс потока начинается с 0, поэтому первый пар помечен 0.

Что случилось с вашей командой

Используя -metadata:s:2 (который, по-видимому, был скопирован дословно из документации), задает метаданные для третьего потока, независимо от типа потока (поскольку спецификатор отсутствует), но ваш вывод содержит только два потока.

Приложение: Нет

Вы можете увидеть что-то вроде этого:

Output #0, matroska, to 'output.mkv':
...
    Stream #0:1: Attachment: none
    Metadata:
      filename        : 2ceb-1916-56bb-3e10
      mimetype        : application/octet-stream

Attachment: none не означает, что вложения нет, но нет связанного с ним формата, поэтому его можно игнорировать.

Также см.

Спецификаторы потока и ffmpeg документация на -attach, -metadata и -map_metadata для более подробной информации.