AVFrame 解析


AVFrame:

1)存儲解碼后的音頻數據或視頻數據.

2)AVFrame必須由av_frame_alloc() 來創建(Note:這只是用來創建AVFrame自身的內存空間,AVFrame結構體中的數據緩沖區,必須由其他方法來管理)

3)AVFrame必須由av_frame_free來釋放

4)AVFrame通常只申請一次空間,然后多次復用來保存不同的數據(例如:一個AVFrame存放從解碼器接收到的幀),在這種情況下,使用av_frame_unref(),引用計數-1,當引用計數為0時,釋放data空間,並且在復用該數據前,會重置該結構體數據,還原成最原始的狀態

注:In such a case, av_frame_unref() will free any references held by the frame and reset it to its original clean state before it is reused again. (這尼瑪 翻譯過來不是釋放所有引用?是指引用計數直接變成0,然后釋放data內存空間?而不是減一?)

5)后面還有,不翻譯了。。。。。。

uint8_t *data[AV_NUM_DATA_POINTERS]:

1)指向平面圖片或平面音頻頻道的指針

2)有可能與第一個分配的的字節不同(尼瑪  啥意思???)

3)一些解碼器在訪問到超過圖片 (0,0) - (寬,高)的范圍,具體看avcodec_align_dimensions2()。一些過濾器和swscale可以讀取到超出平台的16個字節數據,如果這些過濾器要被使用,16個額外的字節必須被申請(what are you 說啥嘞?)

int linesize[AV_NUM_DATA_POINTERS]:

1)對於視頻而言,代表着每個圖像行的大小(字節單位)

2)對於音頻而言,代表着每個平面的大小(字節單位)

3)對於音頻而言只能設置linesize[0],對於平台音頻而言,每個平面通道都必須一樣大小

4)對於視頻而言linesizes應該是cpu字節對齊的倍數,對於現代桌面CPU而言基本是16或32

5)有些代碼需要這樣的對齊,有些代碼在沒有對齊的情況下會變得很慢,而有些代碼則沒有區別

6)注:linesize可能大於可用數據的大小——出於性能考慮,可能會有額外的填充

int width, height:

1)僅對視頻幀,該幀圖像的寬高。

int nb_samples:

1)該幀描述的音頻樣本(每個通道)的數量

int format:

1)幀的格式,-1代表未知或未設置

2)值對應的是視頻的像素格式 enum AVPixelFormat,音頻的樣本格式 enum AVSampleFormat

int key_frame:

1)是否為關鍵幀(1:是        0:不是)

int64_t pts:

1)描述事件戳,以 time_base 時間基礎為單位(應該顯示給用戶 該幀的時間)

int sample_rate:

1)音頻的采樣率

 uint64_t channel_layout:

1)音頻數據的通道布局(啥叫通道布局?)

 int channels:

1)音頻通道數,只用於音頻

2)編碼:未使用

3)解碼:由用戶來讀取

備注:剩下一籮筐的參數,不一一列舉,自個看頭文件去吧。。。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM