2016-08-06 149 views
2

我一直在嘗試複製AVFrame,就像在ffmpeg: make a copy from a decoded frame (AVFrame)中回答的內容。但是,我似乎無法得到它從av_frame_copy()獲得積極的返回碼。複製已解碼的ffmpeg AVFrame

這裏基本上是我在做什麼:

AVFrame *copyFrame = NULL; 
copyFrame = av_frame_alloc(); 

int return_code = av_frame_copy(copyFrame, originalFrame); 
if(return_code < 0){ 
    fprintf(stderr, "av_frame_copy failed with return code %d\n", return_code); 
    return(1); 
} 

如果有幫助,返回代碼,我從av_frame_copy得到的是-22。

+0

錯誤-22似乎意味着你的一個參數無效,根據[這個答案](https://stackoverflow.com/questions/26205017/ffmpeg-avcodec-open2-returns-22-ifi-i- change-my-speaker-configuration/26205126#26205126) – user3386109

回答

6

如果您閱讀av_frame_copy的文檔,它說:「該函數不分配任何東西,dst必須已經初始化並且使用與src相同的參數進行分配。」

av_frame_alloc除了分配AVFrame結構並將其初始化爲某些默認值之外不會執行任何操作。最重要的是,它不會爲幀數據分配緩衝區或準備要使用的幀。 av_frame_copy失敗,因爲目標幀沒有正確的像素格式集或緩衝區分配。

如果您想克隆一個幀(通過遞增其引用計數器,而不是創建深層副本),可以使用av_frame_cloneav_frame_ref

如果你想移動框架,你可以使用av_frame_move_ref

但你可能想做一個適當的深層複製。在這種情況下,您可以查看av_frame_make_writable的源代碼。該功能框架的深層副本,如果它不是寫的,所以我們可以用同樣的邏輯,使這裏的框架的深層副本:

AVFrame *copyFrame = av_frame_alloc(); 
copyFrame->format = frame->format; 
copyFrame->width = frame->width; 
copyFrame->height = frame->height; 
copyFrame->channels = frame->channels; 
copyFrame->channel_layout = frame->channel_layout; 
copyFrame->nb_samples = frame->nb_samples; 
av_frame_get_buffer(copyFrame, 32); 
av_frame_copy(copyFrame, frame); 
av_frame_copy_props(copyFrame, frame); 

請注意,我還沒有進行錯誤檢查我所調用的函數。你應該在你真實的代碼中做到這一點。爲簡潔起見,我在此省略。

+0

感謝您的支持。我閱讀文檔,但一直在卡住如何使用av_frame_get_buffer()。我一直主要使用腳本語言,但我目前正在努力學習C.感謝您的耐心。這是「int align」參數,因爲我不知道對齊應該是什麼,所以拋棄了我。 – loneraver

+1

很高興它有幫助!對齊取決於你在做什麼,儘管32的對齊非常安全,並且應該適用於你正在做的任何事情。某些CPU指令,特別是優化例程中使用的高級SIMD指令需要特定的對齊。你可能能夠避開1的對齊,但是除非你知道你正在做什麼,我建議使用32。[AVFrame.linesize'](https://www.ffmpeg.org /doxygen/trunk/structAVFrame.html#aa52bfc6605f6a3059a0c3226cc0f6567)文檔有更多的細節。 – Cornstalks