繁体   English   中英

在 AVFrame / AVPacket 中使用元数据或 side_data 来存储数字

[英]using metadata or side_data in AVFrame / AVPacket to store a number

我正在努力在编码之前将数字添加到 AVFame/AVPacket 并在解码时取回数字。 我最初的问题是在这里,但我无法让它与 AVFrame 元数据或 side_data 一起使用。 我已经看过像这样的 stackflow 中的各种帖子或 inte.net 上的帖子(使用 AVDictionary、AVDictionaryEntry...),但到目前为止还没有。 我已经设法在帧的元数据 object 中存储了一个数字,但是当我解码 package 时它不存在。有人知道我需要做什么吗? 我的编码设置是否不正确,因此当我解码数据包/帧时我的自定义数据不可用?

如果您能够使用 MKV 作为容器格式,则可以将数字作为BlockAdditional边数据附加到AVPacket ,并从播放期间从容器读取的AVPacket中检索它。 这是一个粗略的示例,使用字符串因为它们易于阅读。

注意:如果您想将边数据与AVFrame相关联,您可能需要进行一些额外的跟踪以将每个AVPacket与相应的AVFrame相匹配。 在FFmpeg中,编解码器不会通过解码保留side-data。

AVPacket* packet;     // from avcodec_receive_packet
int64_t frame_number; // number you want to attach

// Allocate the side data on the packet.
size_t side_data_size = 256;
uint8_t* side_data = av_packet_new_side_data(
    packet, AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, side_data_size);

// Set the BlockAddID. Currently only 1 is supported.
// BlockAdditional data with BlockAddID==1 is intended to store
// data for the codec to use.
uint64_t additional_id = 1;
AV_WB64(side_data, additional_id);

// Put your data in the side_data after the ID.
std::string msg = "frame_number=" + std::to_string(frame_number);
std::strcpy(reinterpret_cast<char*>(side_data + 8), msg.c_str());

然后在播放期间,您可以像这样检索边数据:

AVPacket* packet;     // from av_read_frame

// Get side-data from packet.
int side_data_size;
uint8_t* side_data = av_packet_get_side_data(
    &packet, AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, &side_data_size);

// Print it, or parse it how you want.
std::string msg = (char*)(side_data + 8);
std::cout << msg << std::endl;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM