ffmpeg新舊函數對比

搬運博客園“kn-zheng”大佬博客
從FFmpeg 3.0 開始 , 使用了很多新接口,對不如下:

1、avcodec_decode_video2() 原本的解碼函數被拆解為兩個函數avcodec_send_packet()和avcodec_receive_frame() 具體用法如下:

old:
avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket);
new:
avcodec_send_packet(pCodecCtx, pPacket);
avcodec_receive_frame(pCodecCtx, pFrame);

2、 avcodec_encode_video2() 對應的編碼函數也被拆分為兩個函數avcodec_send_frame()和avcodec_receive_packet() 具體用法如下:

old:
avcodec_encode_video2(pCodecCtx, pPacket, pFrame, &got_picture);
new:
avcodec_send_frame(pCodecCtx, pFrame); avcodec_receive_packet(pCodecCtx, pPacket);

3、avpicture_get_size() 現在改為使用av_image_get_size() 具體用法如下:

old:
avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
new: //最后一個參數align這里是置1的,具體看情況是否需要置1
av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);

4、 avpicture_fill() 現在改為使用av_image_fill_arrays 具體用法如下:

old:
avpicture_fill((AVPicture *)pFrame, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
new: //最后一個參數align這里是置1的,具體看情況是否需要置1
av_image_fill_arrays(pFrame->data, pFrame->linesize, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height,1);

5、關于codec問題有的可以直接改為codecpar,但有的時候這樣這樣是不對的,所以我也還在探索,這里記錄一個對pCodecCtx和pCodec賦值方式的改變

old:
pCodecCtx = pFormatCtx->streams[video_index]->codec; 
pCodec = avcodec_find_decoder(pFormatCtx->streams[video_index]->codec->codec_id);
new:
pCodecCtx = avcodec_alloc_context3(NULL)avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[video_index]->codecpar);
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);

6、PIX_FMT_YUV420P -> AV_PIX_FMT_YUV420P

7、‘AVStream::codec’: 被聲明為已否決:

old:
pCodecCtx = pFormatCtx->streams[videoindex]->codec;
new:
pCodecCtx = avcodec_alloc_context3(NULL)avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoindex]->codecpar);

8、 ‘avpicture_fill’: 被聲明為已否決:

old:
avpicture_fill((AVPicture *)pFrameYUV, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
new:
av_image_fill_arrays(pFrameYUV->data, pFrameYUV->linesize, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);

9、‘avcodec_decode_video2’: 被聲明為已否決:

old:
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet); //got_picture_ptr Zero if no frame could be decompressed
new:
ret = avcodec_send_packet(pCodecCtx, packet);
got_picture = avcodec_receive_frame(pCodecCtx, pFrame); //got_picture = 0 success, a frame was returned //注意:got_picture含義相反
或者:
int ret = avcodec_send_packet(aCodecCtx, &pkt);
if (ret != 0)
{
prinitf("%s/n","error");
return;
} 
while( avcodec_receive_frame(aCodecCtx, &frame) == 0)
{
//讀取到一幀音頻或者視頻 //處理解碼后音視頻 frame
}

10、‘av_free_packet’: 被聲明為已否決:

old:
av_free_packet(packet);
new:
av_packet_unref(packet);

11、avcodec_decode_audio4:被聲明為已否決:

old:
result = avcodec_decode_audio4(dec_ctx, out_frame, &got_output, &enc_pkt);
new:
int ret = avcodec_send_packet(dec_ctx, &enc_pkt);
if (ret != 0)
{
prinitf("%s/n","error");
} 
while( avcodec_receive_frame(dec_ctx, &out_frame) == 0)
{
//讀取到一幀音頻或者視頻
//處理解碼后音視頻 frame
}
舊接口av_register_all()------------新版不需要注冊
PKT_FLAG_KEY ---------------->AV_PKT_FLAG_KEY
AV_CODEC_CAP_DELAY----->AV_CODEC_CAP_DELAY
guess_format ------------>av_guess_format 
av_alloc_format_context ---------->avformat_alloc_output_context 
CODEC_TYPE_VIDEO ----------------->AVMEDIA_TYPE_VIDEO
CODEC_TYPE_AUDIO ---------------->AVMEDIA_TYPE_AUDIO
audio_resample_init ----------------->av_audio_resample_init 
PIX_FMT_YUV420P -> AV_PIX_FMT_YUV420P
AVStream::codec     被聲明為已否決
‘avpicture_get_size’: 被聲明為已否決
新的API中將AVStream結構體中codec作了遺棄處理,當需要解碼器上下文的時候,需要用AVCodecParameters去轉化,解決方案是如下
av_free_packet(packet)--------------------> av_packet_unref(packet);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43538.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43538.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43538.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL8之mysql-community-embedded-compat的作用

MySQL8中的mysql-community-embedded-compat包的作用主要是提供MySQL服務器作為嵌入式庫時的兼容性支持,特別是對于那些使用庫版本18的應用程序。嵌入式MySQL服務器允許開發者將MySQL數據庫直接嵌入到他們的應用程序中,而無需運行獨立的MySQL服務器進程。…

Transformer 論文通俗解讀:FFN 的作用

在經過前面3節關于 Transformer 論文的解讀之后,相信你對提出 Transformer 架構的這篇論文有了一定的了解了,你可以點擊下面的鏈接復習一下前3節的內容。 《Attention is all you need》通俗解讀,徹底理解版:part1 《Attention …

合合信息“大模型加速器”亮相2024世界人工智能大會

文章目錄 📑引言一、大模型發展的挑戰數據稀缺問題 二、大模型“加速器”解決方案概述文檔解析引擎的特征 三、文檔解析引擎的優勢3.1 高速處理能力3.2 智能理解文檔結構3.3 多種數據類型支持3.4 高精度數據提取3.5 應用廣泛,適應性強 四、復雜圖表解析4…

Auslogics Disk Defrag Pro v11激活版下載、安裝、使用教程 (磁盤碎片整理工具)

前言 Auslogics Disk Defrag Pro 是一款支持 FAT16 文件系統的磁盤碎片整理工具,它可以快速整理磁盤碎片,使磁盤空間更加整潔,顯著提升電腦的運行速度。該軟件無需任何分析階段,并且速度比大多數其他碎片整理軟件更快。它可以幫助…

stm32 開發板可以拿來做什么?

STM32開發板可以用來做許多不同的事情,具體取決于您的應用需求和編程能力。我收集歸類了一份嵌入式學習包,對于新手而言簡直不要太棒,里面包括了新手各個時期的學習方向編程教學、問題視頻講解、畢設800套和語言類教學,敲個22就可…

詳解太陽能控制器PWM / MPPT極簡方案其設計要點,臺灣遠翔FP7209升壓24V,30V,36V,42V,48V

文章目錄 前言 一、單節電池升壓9V、12V、24V方案 二、單節電池升壓30V,36V,42V,48V方案 三、芯片介紹 FP7209X與FP7209M的區別: 四、單節電池升壓成為市面上太陽能控制器首選的原因? 總結 前言 太陽能是一種環保…

定時器TIM配置微妙延時函數

定時器TIM配置微妙延時函數 文章目錄 定時器TIM配置微妙延時函數開胃小菜(BOOT0、BOOT1)Boot0Boot1(如果有) 三種定時器高級控制定時器(TIM1,TIM8)通用定時器(TIM2, TIM3, TIM4, TIM…

linux命令: rsync的使用

使用rsync同步本地文件夾到遠程目錄 rsync -zvrt /localdir/ -e ssh -p 30000 rootip:/remotedir/rsync -zvrt /localdir/ /remotedir/ 遠程備份 rsync -avlR --delete -e ssh -p 3231 tangboqi221.122.114.27:backup ~/backup/ R表示保留目錄結構,如果不保留…

基于Intel Chainer 和姿勢檢測的動作識別(人體、面部、手部關鍵點識別動作識別)

項目概述 目標 開發一個能夠實時或近實時識別特定動作的系統,如運動姿勢、表情變化或手勢控制。實現對人體關鍵點的精確追蹤,以便于分析和理解人的動態行為。 技術棧 Intel硬件:可能使用Intel的高性能計算平臺,如Xeon處理器或…

【國潮】國產化系統甲方問題總結

持續更新。。。。。。。。。。。。。。。 【國潮】國產化系統甲方問題總結 1. 安全性問題2. 可靠性和穩定性問題3. 性能問題4. 符合軍事標準問題5. 兼容性和集成問題6. 維護和升級問題7. 項目管理問題8. 隱私和合規性問題9. 災難恢復和備份問題10. 技術支持和培訓問題 引言&am…

zookeeper的shell操作

一:啟動拽庫的shell命令行 zkCli.sh -server localhost:2181 退出:quit 二:查詢所有的命令 help 三:查詢對應的節點 --查詢zk上的根節點 ls / ls /zookeeper 四:查詢對應節點的節點信息(節點的元數據&a…

[AI 大模型] 阿里巴巴 通義千問

文章目錄 [AI 大模型] 阿里巴巴 通義千問簡介模型架構發展新技術和優勢示例 [AI 大模型] 阿里巴巴 通義千問 簡介 阿里巴巴的 通義千問 是由阿里云開發的一款大型語言模型,旨在為用戶提供高效、智能的自然語言處理服務。 通義千問能夠處理多種語言輸入&#xff0c…

c# Bitmap

在C#中,Bitmap 類是一個表示位圖圖像的類,它屬于 System.Drawing 命名空間。Bitmap 類是從 Image 類派生的,因此它繼承了 Image 類的所有屬性和方法,并添加了一些專門用于處理位圖的功能。 以下是關于 Bitmap 類的一些基本信息和…

Supervisord控制進程舉例

當使用Supervisord來控制進程時,通常會配置一個或多個進程組(program group),每個進程組負責監控和管理一個特定的進程或應用程序。以下是一個具體的例子: 假設我們有一個簡單的 Flask 應用程序,我們希望使…

免殺筆記 ---> Session0--DLL注入

剛更新完上一篇,于是我們就馬不停蹄的去跟新下一篇!! Session0注入 :: 各位看官如果覺得還不錯的可以給博主點個贊💕💕 這次,我把這個腳本直接傳到Github上了 喜歡的師傅點個Star噢…

深入理解JS中的防抖節流

在Web開發中,防抖(Debouncing)和節流(Throttling)是兩種常用的優化技術,用于提高頁面性能和用戶體驗。它們通過限制函數執行的頻率來減少計算資源的消耗,尤其是在處理頻繁觸發的事件時,如窗口大小調整、滾動、鍵盤輸入等。 1、防抖(Debouncing) 防抖技術的核心思想是…

風景園林工程設計乙級資質業績要求案例分析

項目數量與規模 數量要求:企業需要提供一定數量的已完成風景園林設計項目案例,這個數量可能依據具體政策而有所不同,但通常需要完成多個項目以展示設計團隊的綜合能力。 規模要求:項目規模需達到乙級資質標準所規定的級別&#…

【C++報錯已解決】Dangling Pointer

🎬 鴿芷咕:個人主頁 🔥 個人專欄: 《C干貨基地》《粉絲福利》 ??生活的理想,就是為了理想的生活! 文章目錄 引言一、問題描述1.1 報錯示例1.2 報錯分析1.3 解決思路 二、解決方法2.1 方法一:使用智能指針2.2 方法二…

本地部署,GFPGAN: 實用的面部修復算法

目錄 什么是 GFPGAN? 技術原理 主要功能 應用場景 本地安裝 運行結果 結語 Tip: 在圖像處理和計算機視覺領域,面部修復是一個重要且具有挑戰性的研究方向。隨著深度學習技術的不斷進步,許多新的算法被提出,用于…

C# 根據日期對mysql數據庫數據篩選的一些操作函數

在C#中,根據日期篩選MySQL數據庫中的數據是一個常見的操作。以下是一些基于日期的數據篩選操作函數示例: 1. 篩選特定日期的數據 public List<YourDataType> GetDataBySpecificDate(DateTime specificDate) {List<YourDataType> dataList = new List<YourDa…