ffmpeg網站:About FFmpeg
1?庫介紹
(1)libavutil是一個包含簡化編程函數的庫,包括隨機數生成器、數據結構、數學例程、核心多媒體實用程序等等。
(2)libavcodec是一個包含音頻/視頻編解碼器的解碼器和編碼器的庫。
(3)libavformat是一個包含多媒體容器格式的拆裝器和拆裝器的庫。
(4)libavdevice是一個包含輸入和輸出設備的庫,用于抓取和呈現許多常見的多媒體輸入/輸出軟件框架,包括Video4Linux、Video4Linux2、VfW和ALSA。
(5)libavfilter是一個包含媒體過濾器的庫。 libswscale是一個執行高度優化的圖像縮放和色彩空間/像素格式轉換操作的庫。
(6)libswresample是一個執行高度優化的音頻重采樣,重矩陣和樣本格式轉換操作的庫。
2?實現步驟
上面是主要用到的函數
(1)av_register_all()
: 注冊 FFmpeg 支持的所有解碼器、編碼器、格式等;
(2)avformat_network_init()
: 初始化網絡支持(如果需要從網絡流中讀取數據);
調用一次即可
(3)avformat_alloc_context()
: 分配一個 AVFormatContext
,它是 FFmpeg 中用于管理多媒體文件或流的核心結構。返回值是一個指向 AVFormatContext
的指針。
(4)avformat_open_input()
: 打開一個輸入文件或流,并將其信息加載到 AVFormatContext
中。這一步會解析文件格式(如 MP4、AVI 等),并為后續的流處理做準備。
(5)avformat_find_stream_info()
: 獲取輸入文件或流的詳細信息,包括音視頻流的編碼格式、幀率、分辨率等。這一步會填充 AVFormatContext
中的 AVStream
信息。
(6)av_read_frame()
: 從輸入文件或流中讀取一幀數據。每次調用 av_read_frame()
會返回一個 AVPacket
,它包含了一幀的編碼數據。如果讀取成功,繼續處理幀數據;如果讀取失敗或到達文件末尾,則停止。
(7)AVPacket
: 包含編碼的幀數據(如壓縮的視頻或音頻數據)。AVFrame
: 包含解碼后的幀數據(如解壓縮后的視頻或音頻數據)。AVPacket
需要通過解碼器(如 avcodec_send_packet()
和 avcodec_receive_frame()
)解碼為 AVFrame
。
(8)avformat_close_input()
: 關閉輸入文件或流,并釋放相關資源。這一步會釋放 AVFormatContext
中的所有流信息。
(9)avformat_free_context()
: 釋放 AVFormatContext
及其占用的內存。
總結:
(1)初始化 FFmpeg 環境。
(2)創建并初始化 AVFormatContext
。
(3)打開輸入文件或流,獲取流信息。
(4)循環讀取幀數據(AVPacket
),并通過解碼器解碼為 AVFrame
。
(5)處理解碼后的幀數據(如播放、保存等)。
(6)關閉輸入流并釋放資源。
3?代碼
使用VS新建cmake工程實現上述步驟。
參考:
ffmpeg 4.22庫文件:GitCode - 全球開發者的開源社區,開源代碼托管平臺
詳細參考:MMAVPlayer/chapter3 at main · StudyWinter/MMAVPlayer · GitHub