1. 程式人生 > >跟著雷神學FFmpeg(二)

跟著雷神學FFmpeg(二)

引言

在前面已經掃盲式的惡補了相關的音視訊的知識點,下面將根據雷神的思路寫一些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 儲存一幀解碼後像素(取樣)資料