跟著雷神學FFmpeg(二)
阿新 • • 發佈:2018-11-17
引言
在前面已經掃盲式的惡補了相關的音視訊的知識點,下面將根據雷神的思路寫一些demo
書寫第一個FFmpeg控制檯程式
// FFmpegLen2.cpp : 定義控制檯應用程式的入口點。 // // #include "stdafx.h" #include <stdio.h> //下面是為了相容呼叫FFmpeg #define __STDC_CONSTANT_MACROS #ifdef _WIN32 //Windows,告訴呼叫的是C語言 extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" }; #else //Linux... #ifdef __cplusplus extern "C" { #endif #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #ifdef __cplusplus }; #endif #endif int _tmain(int argc, _TCHAR* argv[]) { //用於測試FFmpeg是否載入成功,打印出FFmpeg的配置資訊,執行無誤說明配置成功了 printf("%s",avcodec_configuration()); system("pause"); return 0; }
- 在呼叫的時候,需要簡單的配置
- 在專案的屬性中,C/C++ 常規新增標頭檔案
- 連結中新增lib和依賴項
FFmpeg的解碼函式
- av_register_all() 註冊所有元件
- avformat_open_input() 開啟輸入視訊檔案
- avformat_find_stream_info() 獲取視訊檔案資訊
- avcodec_find_decoder() 查詢編碼器
- avcodec_open2() 開啟編碼器
- av_read_frame() 從輸入檔案讀取一幀壓縮資料
- AVPacket
- avcodec_decode_video2() 解碼一陣壓縮資料
- AVFrame
- avcodec_close() 關閉解碼器
- avformat_close_input() 關閉輸入視訊檔案
#FFmpeg解碼的資料結構
AVFormatContext 要申請AVFormatContext 作為操作上下的線索是核心內容
AVFormatContext 包含了
- AVInputFortmat 檔案的封裝格式
- AVStream 是個陣列,一般視訊就是兩個,視訊流和音訊流,AVStream[0]視訊流,AVStream[1]音訊流
- AVCodecContext 處理編解碼,分裝格式在編解碼之上
- AVCodec 每個解碼器都會擁有一個自己的靜態對像,每種音視訊對應一個結構體
- AVPacket 儲存一幀壓縮編碼資料
- AVFrame 儲存一幀解碼後像素(取樣)資料