FFMPEG AVPacket

原文:http://blog.csdn.net/wangshilin/article/details/8186608


FFMPEG使用AVPacket來暫存解複用之後、解碼之前的媒體數據(一個音/視頻幀、一個字幕包等)及附加信息(解碼時間戳、顯示時間戳、時長等)。其中:


    dts表示解碼時間戳,pts表示顯示時間戳,它們的單位是所屬媒體流的時間基準。
    stream_index給出所屬媒體流的索引;
    data爲數據緩衝區指針,size爲長度;
    duration爲數據的時長,也是以所屬媒體流的時間基準爲單位;
    pos表示該數據在媒體流中的字節偏移量;
    destruct爲用於釋放數據緩衝區的函數指針;
    flags爲標誌域,其中,最低爲置1表示該數據是一個關鍵幀。


AVPacket結構本身只是個容器,它使用data成員引用實際的數據緩衝區。這個緩衝區通常是由av_new_packet創建的,但也可能由 FFMPEG的API創建(如av_read_frame)。當某個AVPacket結構的數據緩衝區不再被使用時,要需要通過調用 av_free_packet釋放。av_free_packet調用的是結構體本身的destruct函數,它的值有兩種情 況:1)av_destruct_packet_nofree或0;2)av_destruct_packet,其中,情況1)僅僅是將data和 size的值清0而已,情況2)纔會真正地釋放緩衝區。


FFMPEG內部使用AVPacket結構建立緩衝區裝載數據,同時提供destruct函數,如果FFMPEG打算自己維護緩衝區,則將 destruct設爲av_destruct_packet_nofree,用戶調用av_free_packet清理緩衝區時並不能夠將其釋放;如果 FFMPEG打算將該緩衝區徹底交給調用者,則將destruct設爲av_destruct_packet,表示它能夠被釋放。安全起見,如果用戶希望 自由地使用一個FFMPEG內部創建的AVPacket結構,最好調用av_dup_packet進行緩衝區的克隆,將其轉化爲緩衝區能夠被釋放的 AVPacket,以免對緩衝區的不當佔用造成異常錯誤。av_dup_packet會爲destruct指針爲 av_destruct_packet_nofree的AVPacket新建一個緩衝區,然後將原緩衝區的數據拷貝至新緩衝區,置data的值爲新緩衝區 的地址,同時設destruct指針爲av_destruct_packet。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章