2016-10-04 107 views
0

ffmpeg中,存在描述經解碼的視頻或音頻數據的結構AVFrame。它有一個空指針opaque。該文件聲稱它是「用於用戶的一些私人數據」。ffmpeg中的「不透明」指針AVFrame

這是什麼意思? 它可以用來傳輸任何額外的數據作爲per-frame元數據嗎?

回答

3

這是一個專門用於用戶(而不是ffmpeg庫)使用的領域; ffmpeg不會以任何方式觸及此字段,因此您可以自由使用它。不過有一點需要注意:一些ffmpeg函數會複製AVFrame(或者將AVFrame的引用移動到另一個),其中包括複製該字段的值。管理該字段指向的數據的生命週期可能會有些棘手。

如果你只需要處理一些每幀元數據,你可能要考慮現有的AVFrame提供元數據存儲(見av_frame_get_metadata/av_frame_set_metadata

+0

你能評論所謂的設置使用'av_frame_get_metadata' /'av_frame_set_metadata'嗎?它似乎不存在於'libav'版本6中:9.18-0ubuntu0.14.04.1 –

+0

@ R2-D2你用[tag:ffmpeg]標記了這個標題,並在標題中提到它,但[你實際上並沒有使用FFmpeg ](http://stackoverflow.com/questions/9477115/what-are-the-differences-and-similarities-between-ffmpeg-libav-and-avconv/9477756#9477756)。我可能是錯的,但我不認爲Libav分支具有'av_frame_set_metadata';或者至少你使用的古代來源可能不會。 – LordNeckbeard

+0

Libav從未採用元數據補丁集;最近的libav版本具有可用於(ab)用於做類似事情的邊數據。更重要的是,libav v9很舊,沒有元數據或邊數據,甚至沒有緩衝區參考。它是pre-refcounted幀API,這意味着使用'opaque'更容易,因爲您可以將元數據生命週期與AVFrame生存期連接起來。這也是你使用這個libav版本的唯一選擇。 –

3

要展開什麼@Andrey Turkin說了一下,目的是將特定於應用程序的對象數據添加到AVFrame結構中。具體用例通常是應用程序分配內存時(使用get_buffer2回調)。這個內存可能只是一個指針,但它有時可能是GPU中的內存或類似的東西。無論如何,如果應用程序擁有數據並創建與分配的內存/圖片緩衝區關聯的對象,那麼當解碼器返回avcodec_decode_video2()函數中的給定AVFrame時,它通常會希望訪問關聯的對象,這就是您通常要使用的不透明的領域。

+1

現在,人們通常會在AVBuffer中爲這些用例使用不透明的字段(也可能包含其他字段),而在AVFrame中則不使用它們。 –

+0

因此,如果我理解正確:編碼視頻數據時,由opaque指向的任何用戶數據都不會顯示在結果文件/流中? –

+1

是的。 ffmpeg將不會讀取或寫入該字段,期望在創建幀時將其設置爲NULL,並在複製幀時複製其值。 –