復制解碼的 ffmpeg AVFrame


我一直在嘗試復制一個 AVFrame,就像 ffmpeg: make a copy from a decoded frame (AVFrame) 中的回答一樣.但是,我似乎無法從 av_frame_copy() 獲得正返回碼。

這基本上是我在做什么:

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。

最佳答案

如果您閱讀了 av_frame_copy 的文檔,它說“這個函數沒有分配任何東西,dst 必須已經初始化並分配了與 src 相同的參數。”

av_frame_alloc 除了分配 AVFrame 之外不做任何事情struct 並將其初始化為一些默認值。最重要的是,它不會為幀數據分配緩沖區或准備要使用的幀。 av_frame_copy失敗,因為目標幀沒有正確的像素格式集或分配的緩沖區。

如果你想克隆一個幀(通過增加它的引用計數器,而不是創建一個深拷貝)你可以使用 av_frame_clone 或 av_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);


免責聲明!

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



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