FFmpeg 的常用API

FFmpeg 的常用API

附錄:FFmpeg庫介紹

介紹
libavcodec音視頻編解碼核心庫
編碼 (avcodec_send_frame, avcodec_receive_packet)。
解碼 (avcodec_send_packet, avcodec_receive_frame)。
libavformat提供了音視頻流的解析和封裝功能,多種多媒體封裝格式(如 MP4、MKV、FLV、TS、AVI 等)。
分配和初始化上下文 (avformat_alloc_context, avformat_alloc_output_context2)。
解析媒體流 (avformat_open_input)。
寫入媒體流 (avformat_write_header, av_write_frame, av_write_trailer)。
libavutil提供多種輔助工具。
libswscale處理圖像的縮放和色彩格式轉換。像素格式轉換(從 RGB 轉換為 YUV420)。圖像的尺寸縮放(如調整視頻分辨率)。
轉換像素格式 (sws_scale)。
分配和初始化上下文 (sws_getContext)。
libswresample處理音頻的重采樣和格式轉換
初始化重采樣上下文 (swr_alloc_set_opts, swr_init)。
音頻格式轉換 (swr_convert)。
libavdevice處理設備輸入輸出。
提供多媒體輸入設備的支持(如攝像頭、麥克風)。
libpostproc提供視頻后處理功能。
主要用于視頻質量增強(如去塊效應、降噪處理)。配合視頻解碼器使用,改善解碼后的視頻質量。

附錄1:參考文獻

ffmpeg視頻編解碼流程:https://www.cnblogs.com/fxw1/p/17229792.html

常用API:https://www.cnblogs.com/linuxAndMcu/p/12041359.html

FFmpeg各版本區別:https://juejin.cn/post/7261245655128424509

附錄2:編解碼流程圖

新版本ffmpeg4.0:

image-20241226094141999

老版本ffmpeg3.0:

img

一、通用API

1.1 av_register_all()

初始化 libavformat 和注冊所有的復用器muxer、解復用器demuxer和協議。(ffmpeg4.0已正式廢棄)

void av_register_all(void);

1.2 avcodec_find_encoderavcodec_find_decoder

查找具有匹配編解碼器ID的已注冊編/解碼器,位于 libavcodec\avcodec.h

// 函數的參數是一個編碼器的ID,返回查找到的編碼器(沒有找到就返回NULL)。
AVCodec *avcodec_find_encoder(enum AVCodecID id);// 函數的參數是一個解碼器的ID,返回查找到的解碼器(沒有找到就返回NULL)。
AVCodec *avcodec_find_decoder(enum AVCodecID id);

1.3 avcodec_open2()

**初始化一個視音頻編解碼器的 AVCodecContext以使用給定的AVCodec。**聲明位于 libavcodec\utils.c

int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
  • avctx:需要初始化的 AVCodecContext。
  • codec:輸入的AVCodec。
  • options:一些選項。例如使用libx264編碼的時候,“preset”,“tune”等都可以通過該參數設置。

1.4 avcodec_close()

關閉給定的avcodeContext并釋放與之關聯的所有數據,聲明位于 libavcodec\utils.c

int avcodec_close(AVCodecContext *avctx);

二、解碼相關API

2.1 avformat_open_input()

打開輸入流和讀取頭信息,流必須使用avformat_close_input()關閉

int avformat_open_input(AVFormatContext **ps,const char *url,AVInputFormat *fmt, AVDictionary **options);
  • ps:用戶提供的AVFormatContext(由avformat_alloc_context分配)的指針。
  • url:打開的視音頻流的 URL。
  • fmt:如果!=NULL,則此參數強制使用特定的輸入格式。否則將自動檢測格式。
  • options:包含AVFormatContext和demuxer私有選項的字典;一般情況下可以設置為 NULL。

2.2 avformat_find_stream_info()

**讀取檢查媒體文件的數據包以獲取具體的流信息,**如媒體存入的編碼格式。

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)  
  • ic:媒體文件的上下文
  • options:字典,配置選項

2.3 av_read_frame

讀取碼流中的音頻若干幀或者視頻一幀

例如,解碼視頻的時候,每解碼一個視頻幀,需要先調用 av_read_frame() 獲得一幀視頻的壓縮數據,然后才能對該數據進行解碼。

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

2.4 avcodec_send_packet()

新版FFMPEG4.0引入:主要用于將編碼或解碼的數據包(Packet)送入編解碼器的輸入隊列

int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
  • avctx:指向 AVCodecContext 結構的指針,包含與編碼器或解碼器相關的配置信息。(如avcodec_open2初始化的編解碼器)

  • avpkt:指向 AVPacket 結構的指針,表示要送入編解碼器的輸入數據包。(如av_read_frame的數據包)

2.5 avcodec_receive_frame()

新版FFMPEG4.0引入:用于從解碼器獲取解碼后幀

int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
  • avctx:指向 AVCodecContext 結構的指針,它包含與解碼器相關的上下文和配置信息。你必須在解碼器初始化后(通過 avcodec_open2)提供此參數。

  • frame:指向 AVFrame 結構的指針,接收解碼后的幀數據。AVFrame 是一個結構體,表示解碼后的視頻或音頻數據。解碼后的數據將存儲在這個結構中。

為什么要使用 avcodec_send_packetavcodec_receive_frame

  • 分離輸入和輸出:使用這兩個函數可以將輸入和輸出解耦,給解碼器提供更大的靈活性。例如,在多線程環境中,你可以在一個線程中調用 avcodec_send_packet 發送數據包,而在另一個線程中調用 avcodec_receive_frame 獲取解碼結果。
  • 線程安全:新版的 API 提供了線程安全的機制,尤其適用于異步解碼或編碼任務。
  • 增強性能和靈活性:通過逐步處理數據,避免了直接處理整個解碼過程所帶來的性能瓶頸。

2.6 avformat_close_input()

對應2.1;關閉打開的流。并釋放AVFormatContext的所有內容并將*s設置為空

void avformat_close_input(AVFormatContext **s)  

## 三、編碼相關API### 3.1 `avformat_alloc_output_context2`> 用于**分配并初始化**一個輸出媒體格式的上下文 (`AVFormatContext`)  (通常是第一個調用的函數)```c++
int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, const char *format_name, const char *filename);
  • ctx:指向輸出上下文指針的指針,用于存儲分配的 AVFormatContext

  • oformat:指定輸出格式(AVOutputFormat),可以為 NULL。如果為 NULL,則根據 format_namefilename 自動推斷格式。

  • format_name:指定輸出格式的名稱(如 "mp4""mkv" 等),用于明確輸出文件的封裝格式。可以為 NULL

  • filename:輸出文件的名稱。此參數會用于推斷格式(如果 oformatformat_name 都為 NULL)。

3.2 avformat_write_header()

為輸出文件寫入文件頭,準備文件封裝格式所需的元數據。

int avformat_write_header(AVFormatContext *s, AVDictionary **options);
  • s (AVFormatContext):指向輸出上下文 (AVFormatContext) 的指針,必須是用 avformat_alloc_output_context2 創建的,并且已經設置好音視頻流 (AVStream)。

  • options (AVDictionary**):用于傳遞格式化選項的字典指針,可以為 NULL

    • 設置編碼參數(如比特率 bit_rate)。

    • 設置容器格式選項(如 movflags)。

    • 需要在調用完成后手動釋放(通過 av_dict_free)。

3.3 av_write_frame()

用于將單個媒體包(AVPacket)寫入輸出文件。它是音視頻數據封裝的重要步驟,直接處理編解碼后的數據幀。

int av_write_frame(AVFormatContext *s, AVPacket *pkt)

s (AVFormatContext*)
指向輸出上下文的指針,通常由 avformat_alloc_output_context2 創建并初始化。

pkt (AVPacket*)
包含需要寫入的媒體數據的包(AVPacket)。它應該包含目標流的索引 (stream_index)、解碼后的時間戳(PTS/DTS)、以及數據緩沖區。

3.4 av_write_trailer()

用于輸出文件尾

int av_write_trailer(AVFormatContext *s)

四、圖像處理API

4.1 sws_getContext()

用于初始化一個縮放上下文 (SwsContext),以便進行視頻像素格式的轉換或尺寸縮放

struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,int dstW, int dstH, enum AVPixelFormat dstFormat,int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param
);
  • srcWsrcH:輸入圖像的寬度和高度。srcFormat:輸入圖像的像素格式(AVPixelFormat 枚舉值,例如 AV_PIX_FMT_YUV420P)。

  • dstWdstH:輸出圖像的寬度和高度。dstFormat:輸出圖像的像素格式(例如 AV_PIX_FMT_RGB24)。

  • flags:用于控制縮放的算法。可以是以下值之一或它們的組合:

    • SWS_FAST_BILINEAR:快速雙線性縮放。

    • SWS_BILINEAR:雙線性縮放。

    • SWS_BICUBIC:雙三次插值縮放(質量高)。

    • SWS_LANCZOS:Lanczos重采樣(質量最高)。

  • srcFilterdstFilter:分別為輸入和輸出圖像使用的濾波器。通常為 NULL

  • param:濾波器相關參數,通常為 NULL

4.2 sws_scale()

libswscale 庫中的關鍵函數,用于在圖像轉換和縮放過程中執行實際的像素格式轉換和尺寸調整操作。它在 sws_getContext 初始化的上下文中完成圖像數據處理

int sws_scale(struct SwsContext *c,const uint8_t * const srcSlice[],const int srcStride[], int srcSliceY,int srcSliceH, uint8_t *const dst[],const int dstStride[]) )

c (struct SwsContext):指向由 sws_getContext 返回的上下文結構體,定義了轉換和縮放的參數。

srcSlice (const uint8_t *const[]):輸入圖像的每個平面的指針數組(通常是 AVFrame->data)。

srcStride (const int[]):輸入圖像每行的字節數數組,對應每個數據平面(通常是 AVFrame->linesize)。

srcSliceY (int):輸入圖像處理的起始行號,通常為 0。

srcSliceH (int):輸入圖像處理的行數(高度),例如 AVFrame->height

dst (uint8_t *const[]):輸出圖像的每個平面的指針數組,存儲轉換后的數據。

dstStride (const int[]):輸出圖像每行的字節數數組,對應每個數據平面。

4.3 sws_freeContext()

釋放一個 SwsContext

void sws_freeContext(struct SwsContext *swsContext)

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

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

相關文章

關于最新MySQL9.0.1版本zip自配(通用)版下載、安裝、環境配置

一、下載 從MySQL官網進行下載MySQL最新版本,滑到頁面最下面點擊社區免費版,(不是企業版) 點擊完成后選擇自己想要下載的版本,選擇下載zip壓縮,不用debug和其他的東西。 下載完成后進入解壓,注…

vulnhub靶場 Empire LupinOne

使用命令查看靶機ip,訪問ip arp-scan -l 使用御劍掃描一下子域名,但是沒有獲取到什么有用的信息 這是一個Apache文檔,沒有什么用 緊接著我們嘗試暴力破解,這里推薦使用ffuf工具暴力破解目錄,kali自帶的ffuf掃描速度賊快 參數解釋…

Kubernetes# Helm工具使用

目錄 概念 核心組件 Helm客戶端 Tiller Chart Repository Release Helm安裝 Helm使用 創建Helm Chart 定義Chart元數據 定義Template模板 定義values參數 打包和部署 Helm Chart 推送到遠程倉庫 Helm常用命令 概念 Helm 是一個 Kubernetes 的包管理工具&#…

Mirror網絡框架-從入門到精通之Mirror簡介

前言 在現代游戲開發中,網絡功能日益成為提升游戲體驗的關鍵組成部分。Mirror是一個用于Unity的開源網絡框架,專為多人游戲開發設計。它使得開發者能夠輕松實現網絡連接、數據同步和游戲狀態管理。本文將深入介紹Mirror的基本概念、如何與其他網絡框架進…

Yocto 項目中的交叉編譯:原理與實例

Yocto 項目是一個強大的工具集,它專注于為嵌入式系統生成定制的 Linux 發行版。交叉編譯在 Yocto 項目中扮演著核心角色,它使得開發者能夠在功能強大的宿主機上構建適用于資源受限目標設備的軟件系統。這篇文章將從運行原理、實際案例和工具鏈組成等角度…

python學opencv|讀取圖像(二十二)使用cv2.polylines()繪制多邊形

【1】引言 前序學習進程中,已經掌握了使用pythonopencv繪制線段、矩形和圓形的基本操作,相關鏈接包括且不限于: python學opencv|讀取圖像(十八)使用cv2.line創造線段-CSDN博客 python學opencv|讀取圖像(…

教師管理系統

大概功能: 1.顯示所有教師 2.按姓名查找教師 3.按工號查找教師 4.增加教師 5.刪除教師 6.退出 數據會保存到 txt 文件里面 姓名:必須是中文 手機號碼:必須是11位,必須是數字 效果展示: 代碼展示: Teache…

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段:定義小程序頂部、底部 tab 欄,用以實現頁面之間的快速切換;可以通過 tabBar 配置項指定 tab 欄的表現,以及 tab 切換時顯示的對應頁面; 在上面圖中,標注了一些 tabBar …

[Wireshark] 使用Wireshark抓包https數據包并顯示為明文、配置SSLKEYLOGFILE變量(附下載鏈接)

wireshark 下載鏈接:https://pan.quark.cn/s/eab7f1e963be 提取碼:rRAg 鏈接失效(可能會被官方和諧)可評論或私信我重發 chrome與firefox在訪問https網站的時候會將密鑰寫入這個環境變量SSLKEYLOGFILE中,在wireshark…

Android筆記(四十一):TabLayout內的tab不滾動問題

背景 假設二級頁面是上面圖片的布局,當進來時TabLayout和ViewPager2綁定完就馬上調setCustomItem,跳轉到最后一個tab頁面時,會發現tab不滾動,手動滑一下ViewPager2時才會滾動tab到正確的位置 原因分析 調用TabLayoutMediator.at…

【Spring】 Bean 注入 HttpServletRequest 能保證線程安全的原理

文章目錄 前言1. 圖示2. 源碼坐標后記 前言 今天看了一段老業務代碼,HttpServletRequest 被注入后直接用于業務邏輯。 好奇Spring是如何解決線程安全問題。 Controller public class TestController {ResourceHttpServletRequest request;ResponseBodyGetMapping(…

CSS面試題|[2024-12-24]

1.說一下CSS的盒模型 在HTML頁面中的所有元素都可以看成是一個盒子 盒子的組成:內容content、內邊距padding、邊框border、外邊距margin 盒模型的類型: 標準盒模型 margin border padding content IE盒模型 margin content(包括border p…

Unity中如何修改Sprite的渲染網格

首先打開SpriteEditor 選擇Custom OutLine,點擊Genrate 則在圖片邊緣會出現邊緣線,調整白色小方塊可以調整邊緣 調整后,Sprite就會按照調整后的網格渲染了。 如何在UI中使用? 只要在UI的Image組件中選擇Use Sprite Mesh 即可 結果&#xff1…

【Artificial Intelligence篇】AI 前沿探秘:開啟智能學習的超維征程

目錄 一、人工智能的蓬勃發展與智能學習的重要性: 二、數據的表示與處理 —— 智能學習的基石: 三、構建一個簡單的感知機模型 —— 智能學習的初步探索: 四、神經網絡 —— 開啟超維征程的關鍵一步: 五、超維挑戰與優化 —— 探索智能學習的深度: 六、可視化與交互 —— …

docker-compos mysql5.7主從配置

docker-compos mysql5.7主從配置 docker-compose目錄結構 配置文件 master/my.cnf [client] port 3306 socket /var/run/mysqld/mysqld.sock[mysqld_safe] pid-file /var/run/mysqld/mysqld.pid socket /var/run/mysqld/mysqld.sock nice 0…

開源輕量級文件分享服務Go File本地Docker部署與遠程訪問

???歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學習,不斷總結,共同進步,活到老學到老…

路過石巖浪心古村

周末常去的七彩城堡兒童樂園附近經常有老房子,沒想到老房子最多的地方還是浪心古村。而且越看越有歷史。 見到一座寫著《序西書室》的房子,我最開始以為是一個古代的學校。但是查了百度更加不知道什么意思了哈。?“序西書室”?是指《文心雕龍》中的一個…

面經hwl

線程進程協程區別 線程、進程和協程是計算機編程中常見的三個并發模型,它們各自有不同的特點和應用場景: 1. 進程 (Process) 定義: 進程是操作系統中資源分配的基本單位,代表一個正在運行的程序實例。特點: 獨立性: 每個進程有自己獨立的內…

【每日學點鴻蒙知識】PersistentStorage持久化、插槽方法、相對布局、上拉加載下拉刷新、List聯動滑動

1、HarmonyOS 使用PersistentStorage持久化用戶信息無效? 在首頁通過StorageLink(‘userInfoTest’) userInfoTest: string 獲取,獲不到,返回undefind。是什么原因呢? 首先在首頁時,在Entry外聲明PersistentStorage…

torch.tensor

torch.tensor 通過復制數據構造一個張量 (構造出的張量是一個沒有自動微分(autograd )歷史的張量,也稱為葉張量,參考Autograd mechanics)。 torch.tensor(data, *, dtypeNone, deviceNone, requires_gra…