1. 程式人生 > 實用技巧 >5.FFMPEG-Qt移植ffmpeg、ffmpeg結構體介紹

5.FFMPEG-Qt移植ffmpeg、ffmpeg結構體介紹

本章參考:

https://blog.csdn.net/leixiaohua1020/article/details/11693997

https://blog.csdn.net/leixiaohua1020/article/details/14214705

1.FFmpeg介紹

ffmpeg主要基於命令列來實現,進入網站https://ffmpeg.zeranoe.com/builds/下載,如下圖所示:

  • Static靜態庫 : 這個版本只包含了ffmpeg.exe、ffplay.exe、ffprobe.exe三個可執行程式,沒有標頭檔案和庫檔案。
  • Shared動態庫 : 這個版本包含了ffmpeg.exe、ffplay.exe、ffprobe.exe三個可執行程式和相關dll、lib等動態庫檔案。
  • Dev開發庫 : 這個包含了標頭檔案和庫檔案。

  • ffmpeg.exe: 用於轉碼的工具
  • ffplay.exe: 用於播放的工具
  • ffprobe.exe: 用於解析媒體檔案格式的工具

由於我使用的QT庫是MinGW_32bit版本的,所以需要下載32bit的ffmpeg.否則使用64bit的

在命令列使用中,我們只需要shared版本即可.

2.移植庫到程式中

在實際開發中,我們需要下載Dev版本(開發者版本).

然後修改pro,匯入Dev版本里的include檔案和lib檔案:

INCLUDEPATH +=F:/ffmpeg/win32/include
LIBS += -L F:/ffmpeg/win32/lib/ -lavutil -lavformat -lavcodec -lavdevice -lavfilter -lpostproc -lswresample -lswscale

3.QT測試庫完整性

由於ffmpeg是C寫的,所以我們需要使用extern來宣告ffmpeg標頭檔案,程式碼如下:

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>

 
extern "C"{

#include <libavcodec/avcodec.h>

}

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    qDebug() << "This FFmpeg Version Is : 
" << avcodec_version(); qDebug() << "This FFmpeg configuration Is : " <<avcodec_configuration(); return 0; }

如果能夠列印資訊則說明ffmpeg可以正常使用了.

4.FFmpeg庫簡介

FFmpeg常用庫如下:

  • avcodec : 用於各種型別聲音/影象編解碼(最重要的庫),該庫是音視訊編解碼核心
  • avformat:用於各種音視訊封裝格式的生成和解析,包括獲取解碼所需資訊以生成解碼上下文結構和讀取音視訊幀等功能;音視訊的格式解析協議,為 avcodec分析碼流提供獨立的音訊或視訊碼流源
  • avfilter : 濾鏡特效處理, 如寬高比 裁剪 格式化 非格式化 伸縮。
  • avdevice:各種硬體採集裝置的輸入輸出。
  • avutil:工具庫,包括算數運算字元操作(大部分庫都需要這個庫的支援)
  • postproc:用於後期效果處理;音視訊應用的後處理,如影象的去塊效應。
  • swresample:音訊取樣資料格式轉換。
  • swscale:視訊畫素資料格式轉換、如 rgb565、rgb888 等與 yuv420 等之間轉換。

5.FFmpeg結構體對應關係

  • AVFormatContext : 儲存視音訊封裝格式(flv,mp4,rmvb,avi)中包含的所有資訊
  • AVInputFormat : 存在AVFormatContext ->iformat中, 儲存視訊/音訊流的封裝格式(flv、mkv、avi等),其中name成員可以檢視什麼格式
  • AVStream: 視音訊流,存在AVFormatContext->streams[i], 每個AVStream包含了一個流,一般預設兩個(0為視訊流,1為音訊流).
  • AVCodecContext: 存在AVFormatContext->streams[i] ->codec中,儲存解碼器上下文結構體(儲存解碼相關資訊,主要儲存在程式執行時才能確定的資料),每個AVCodecContext包含了一個AVCodec解碼器(比如h.264解碼器、mpeg4解碼器等),
  • AVCodec : 存在AVCodecContext->codec中,指定具體的解碼器(比如h.264解碼器、mpeg4解碼器等),。
  • AVPacket :解碼前的音訊/視訊資料,通過av_read_frame()來獲取一幀未解碼的資料
  • AVFrame :解碼後的音訊/視訊資料,比如解碼視訊資料則通過avcodec_receive_frame()來獲取一幀AVFrame資料
  • AVIOContext :存在AVFormatContext ->pb中,用來儲存檔案資料的緩衝區,並通過相關標記成員來實現檔案讀寫操作,其中的opaque 成員這是用於關聯 URLContext 結構
  • URLContext : 存在AVIOContext->opaque中,表示程式執行的當前廣義輸入檔案使用的 context,著重於所有廣義輸入檔案共有的屬性(並且是在程式執行時才能確定其值)和關聯其他結構的欄位.
  • URLProtocol : 存在URLContext-> prot中,音視訊輸入檔案型別(rtp,rtmp,file, rtmps, udp等),比如file型別的結構體初始化如下:

結構體定義參考:

2.AVFormatContext和AVInputFormat

3.AVPacket使用

4.FFMPEG-AVFrame

未萬待續~