從零開始學習音視頻編程技術(四) FFMPEG的使用(學習筆記)

 原文地址:http://blog.yundiantech.com/?log=blog&id=7

==================================================

音視頻開發中最常做的就是編解碼的操作了,以H.264爲例:如果想要自己實現編碼h.264,需要對H.264非常的瞭解,首先需要查看H.264的文檔,這個文檔好像說是三百多頁(本人並沒有看過)。 想到這,你還寫的下去麼。 算了吧!   好在H264的編碼器,有人已經寫好了,而且還提供了源代碼。主流的h264編碼器有 x264 t264等。 

    因爲我們不做研究,也不會去寫編碼器,因此完全沒有必要去看H.264的手冊。我們要做的只需要知道有這麼個東西,在需要的時候 稍微瞭解一下h264的數據格式。最後當然是直接使用別人寫好的編碼器來編碼了。 一個好的程序猿就要做到儘量使用現成的東西做開發,減少精力,減少時間,甚至提高穩定性。

    前面提到的t264和x264都是編解碼h.264用的庫。本人通常是使用x264來做。但對於新手來說,由於對h.264不是很瞭解,因此在使用x264上有點困難,出了問題通常不知道如何解決。並且這些庫都只能編碼一種格式,所以一開始不推薦使用。 而是推薦使用FFMPEG。

    

    FFMPEG是一個集成了各種編解碼器的庫,可以說是一個全能型的工具,從視頻採集、視頻編碼到視頻傳輸(包括RTP、RTCP、RTMP、RTSP等等協議)都可以直接使用FFMPEG來完成,更重要的一點FFMPEG是跨平臺的,Windows、Linux、Aandroid、IOS這些主流系統通吃。因此初期強烈建議直接使用FFMPEG。

======================================================

那麼開始記錄下如何在windows下ffmpeg的使用,前面有相應的文章關於在linux下的配置和簡單使用。

!!!!開始使用FFMPEG

一、FFMPEG獲取:(這裏的部分,我是按原博客使用的環境鏈接貼出來,因爲版本比較老了,可能因爲新的環境的問題在後面編譯時出問題,或其他的問題,所以我這裏是照着原博主的方法做的

這裏以Windows版爲例,我們前期的例子都是直接在Windows上進行的,因此直接下載Windows版本的,其他系統的先不管他。

下載地址:

https://ffmpeg.zeranoe.com/builds/   (下面我有貼出我這裏使用的文件的,鏈接,可以直接下載

打開後可看到如下界面:

其中 Static 顧名思義就是靜態庫版本了。

Shared則是動態庫版本。

Dev則是提供給開發者用的Lib文件。

    

FFMPEG最新版已經是3了。

不過我們用的還是2.5的,當然也可以用其他的,如2.8。基本上版本2的API都是沒差的,因此對開發沒有影響。

 

 

首先下載Dev庫,點擊Previous FFmpeg 32-bit Dev Versions 。

 

找到2.5版本的 點擊下載:

 

ffmpeg-2.5.2-win32-shared: 鏈接:https://pan.baidu.com/s/1SvizwUkSCdqB9eaGNSXrSg 密碼:j2tk

ffmpeg-2.5.2-win32-dev     : 鏈接:https://pan.baidu.com/s/1gObvbmAiwKNHHUVrIKc4VQ 密碼:qrp3

 

二、在工程中引用FFMPEG

打開我們前面搭建好的Qt Creator。新建一個工程,隨便都行,就選純C++工程吧:

 

切記:名字和路徑一定不能有中文。

 

 

我的工程是放在 :E:MyProjectsVideoDevelop 目錄下

 

 

解壓出剛纔下載的ffmpeg,解壓後的目錄名字是ffmpeg-2.5.2-win32-dev

改名成ffmpeg,並且只留下include和lib這2個文件夾,其他都刪了。

將ffmpeg直接複製到我們的工程目錄下:

 

Qt Creator中修改工程配置文件 testFFmpeg.pro:

在裏面加入:

INCLUDEPATH += $$PWD/ffmpeg/include

LIBS += $$PWD/ffmpeg/lib/avcodec.lib \
        $$PWD/ffmpeg/lib/avdevice.lib \
        $$PWD/ffmpeg/lib/avfilter.lib \
        $$PWD/ffmpeg/lib/avformat.lib \
        $$PWD/ffmpeg/lib/avutil.lib \
        $$PWD/ffmpeg/lib/postproc.lib \
        $$PWD/ffmpeg/lib/swresample.lib \
        $$PWD/ffmpeg/lib/swscale.lib

 

這就是引用ffmpeg的頭文件和庫的意思,如下所示:

 

mian.cpp寫成如下:

#include <iostream>

using namespace std;

extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavdevice/avdevice.h"

}

///由於我們建立的是C++的工程
///編譯的時候使用的C++的編譯器編譯
///而FFMPEG是C的庫
///因此這裏需要加上extern "C"
///否則會提示各種未定義

int main()
{
    //這裏簡單的輸出一個版本號
    cout << "Hello FFmpeg!" << endl;
    av_register_all();
    unsigned version = avcodec_version();
    cout << "version is:" << version;
    return 0;

}

好了點擊左下角的綠色按鈕編譯 或 CTRL+R進行編譯。

 

本以爲結束了。

然而發現問題來了:

只有一個黑框,並沒有那些版本的信息打印出來。。。

 

首先打開工程目錄,會發現同目錄下多了一個文件夾:build-testffmpeg-Desktop_Qt_5_6_0_MinGW_32bit-Debug

打開它,我們生成的exe文件就在build-testffmpeg-Desktop_Qt_5_6_0_MinGW_32bit-Debug/debug/testFFmpeg.exe

直接雙擊運行看看到底是什麼情況。

雙擊運行之後就有提示了,提示缺少dll文件:

 

原來忘記把ffmpeg的dll文件放到裏面了。

 

我們剛剛只是下載了Dev包,這裏面只有LIB文件,Lib文件是編譯連接的時候需要用到的。

而運行的時候需要DLL,因此繼續下載FFMPEG的Shared版本,,(上面貼出來了鏈接的)

找到2.5的,下載下來。

一定要和剛纔下載的版本一致,否則是沒法運行的:

 

解壓出 ffmpeg-2.5.2-win32-shared.7z

打開會看到一個bin目錄,裏面都是dll文件,這些就是運行時需要的動態庫,

 

 

將這些dll複製到,剛纔我們生成exe的目錄下(要和exe放在一起)

 

現在重新打開Qt Creator,運行,這次終於對了,出現了版本信息:

 

至此,就成功在QT中引用了FFMPEG庫了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章