c++ - 视频写入后以编程方式将附件添加到 Matroska (mkv)

标签 c++ ffmpeg libav mkv matroska

我想添加一个 protobuf作为 Matroska (mkv) 视频文件的附件的消息 在没有复制视频数据的情况下写入所有视频帧后 .这必须是可能的,因为可以使用 MKVToolNix 套件(对于 JPG)来实现将任意文件附加到 mkv:

# 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用于从/向 mkv 读取/写入视频数据。因此,我最喜欢的解决方案也只取决于 libav .如果这不可能,我会考虑引入 libEBMLlibMatroska作为新的依赖项(与 MKVToolNix 相同)。

框架中需要调用哪些关键函数才能实现目标?我很确定mbunkus知道解决办法...

最佳答案

我还没有以编程方式附加文件,但我能够阅读附件。这样做收集的信息至少也有助于实现写作。

附件作为附加流处理。附件的流不包含帧。相反,数据作为额外数据存储到此流的编解码器中。文件名和 mime 类型作为元数据提供给编解码器。

关于c++ - 视频写入后以编程方式将附件添加到 Matroska (mkv),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32889119/

相关文章:

mp4转mpeg ts,视频和音频播放速度过快

c++ - 如何旋转 AVFrame?

c++ - 通过注入(inject)进行死锁检测

c++ - 在 VS2010 中使用长 double 编译 Windows C++ 应用程序

未找到 PHP ffmpeg

c++ - 调用 avformat_find_stream_info 会阻止简单 PNG 图像的解码?

c++ - 指向普通变量的常量指针

java - Java 和 C++ 之间 IPC 的最佳方法是什么?

image - 适用于 Instagram 的 ffmpeg 缩放图像 (640x640)

c++ - 如何从avi文件中读取YUV8数据?