Я хочу добавить protobuf
сообщение в виде вложения в видеофайл Matroska (mkv) после того, как все видеокадры были записаны без копирования видео данных. Это должно быть возможно, потому что присоединение произвольного файла к MKV может быть достигнуто с помощью пакета MKVToolNix (для JPG):
# add attachment, no copy according to man page
mkvpropedit out.mkv --add-attachment ~/Downloads/hummingbird.jpg
.
.
# get attachment id
mkvmerge -i out.mkv
.
Attachment ID 1: type 'image/jpeg', size 821740 bytes, file name 'hummingbird.jpg'
.
# extract attachment
mkvextract attachments out.mkv 1:./test.jpg
Я хочу быть в состоянии выполнить тот же цикл чтения-записи, вызывая методы библиотеки. Желательно без необходимости писать protobuf
сообщение в файл первым (например, путем передачи байтового массива сериализованного protobuf
сообщение).
В настоящее время я использую libav
для чтения / записи видеоданных с / на мкв. Поэтому мое любимое решение будет зависеть только от libav
, Если это невозможно, я бы рассмотрел введение libEBML
а также libMatroska
как новые зависимости (так же, как MKVToolNix).
Какие ключевые функции в рамках должны быть вызваны для достижения цели? я точно уверен mbunkus знает решение …
Я еще не вложил файл программно, но смог прочитать вложение. Собранная при этом информация может, по крайней мере, помочь в реализации письма.
Вложения обрабатываются как дополнительные потоки. Поток для вложения не содержит фреймы. Вместо этого данные сохраняются как экстраданные для кодека для этого потока. Имя файла и тип MIME передаются кодеку в качестве метаданных.
Других решений пока нет …