簡體   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