FFmpeg AVPacket和av_packet_unref函數剖析

描述

        AVPacket保存一個NAL單元的解碼前數據,該結構本身不直接包含數據,其有一個指向數據域的指針。傳遞給avcodec_send_packet函數的AVPacket結構體data中的數據前面是

00 00 00 01開頭,說明是NALU格式的數據

數據簡單如下:
00 00 00 01 61 e1 40 01 58 2b fb 22 ff 29 7b 3f 6f 67 2f 29 fa 25 53 68 78 46 b1

在調用avcodec_send_packet函數的時候打印錯誤如下:
I:2018-01-06 15:06:05 ms:887:nal_unit_type: 1, nal_ref_idc: 3
I:2018-01-06 15:06:05 ms:888:non-existing PPS 0 referenced
I:2018-01-06 15:06:05 ms:888:decode_slice_header error
I:2018-01-06 15:06:05 ms:888:no frame!


當數據如下,可以正確的解析出一幀圖像

00 00 00 01 67 42 00 2a 96 35 40 f0 04 4f cb 37 01 01 01 40 00 01 c2 00 00 57 e4  
01 00 00 00 01 68 ce 3c 80 00 00 00 01 06 e5 01 ef 80 00 00 03 00 00 00 01 65 b8  
00 00 52 58 00 00 27 f5 d4 48 7e b4 41 07 24 60 95 2c 92 37 68 75 63 4c ad 3f b1

很顯然,67是SPS,68是PPS,然後65是關鍵幀,開始出來圖像

void av_packet_unref(AVPacket *pkt)
{
    av_packet_free_side_data(pkt);
    av_buffer_unref(&pkt->buf);
    av_init_packet(pkt);
    pkt->data = NULL;
    pkt->size = 0;
}

簡單使用
    AVPacket packet;
    av_init_packet(&packet);
    packet.data = (uint8_t*)data;
    packet.size = (int)bytes;
    //保存數據
    av_packet_unref(&packet);

經過av_paceket_unref函數之後,只是將data置爲NULL,size置爲0

參考
http://blog.csdn.net/BrookIcv/article/details/53490799
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章