1. 程式人生 > >FFMPEG與X264在windows下用VS編譯,VS與QT下執行與除錯

FFMPEG與X264在windows下用VS編譯,VS與QT下執行與除錯

前言:

最近在做視訊隱寫分析的畢業設,現在做的差不多了。打算髮幾篇文章整理一下最近的工作,為寫畢業論文做個準備。

作為一隻寫第一次寫CSDN的渣渣,如果內容有誤敬請各位大佬指出。

下面開始正篇

先簡要介紹一下幾個概念

H264格式視訊:是一種視訊流的格式,本身沒有音訊流。很多格式的視訊(如MP4,FLV)其中的視訊流都用的是H264格式。雖然最新已經有H265格式了,但是H264格式應用依舊十分廣泛。

FFMPEG:主要是一個多媒體編碼的轉換器,支援很多種格式的多媒體流轉換。FFMPEG本身並沒有H264格式的編碼器,只有H264格式的解碼器,但是卻給H264格式的編碼器留出了介面,所以需要X264來補足ffmpeg對H264編碼的空缺。

X264:X264是一個H264格式的編碼器,用於將原生的視訊檔案轉成H264格式。

這一篇主要講ffmpeg在windows環境下的搭建,網上有不少很詳細的文章,作為一隻菜鳥並不能完全領會其中每個指令的意義,接著我從一隻菜鳥的角度來給大家介紹如何編譯執行FFMPEG,這裡我用的編譯器是VS2015自帶的。

1. 前序工作:

1.1 VS下載與安裝:這裡請各位大佬各顯神通吧,未必一定要用VS2015的編譯器,只要能支援C99語法的都OK。本人用的VS2015 Community中文版本,安裝過程中一定得把C/C++選上。

1.2 MinGW下載與安裝:由於FFMPEG本身是linux下開發的程式碼,所以需要一個模擬的linux環境來編譯。

1.3 yasm下載:這個是大概彙編的編譯器,如果希望ffmpeg跑得快的話不少地方是直接調用匯編的,所以會用到。作為一個新手最後其實是把它disable掉了。下載注意是32位還是64位的,下載完後應該只有一個exe檔案,把它重新命名成yasm.exe,複製到[mingw目錄]/msys/1.0/bin裡面。

1.4重新命名mingw中的link.exe:安裝VS時在環境變數的目錄裡面有一個link.exe了,mingw的環境變數裡面也有一個link.exe,我們選用VS的工具,所以把mingw的link.exe隨便改個其他名字就行。mingw中的link.exe位於[mingw目錄]/msys/1.0/bin

1.5用VS命令工具開啟msys:找到VS目錄下 VS2015x86本機工具命令提示符 這個東西(根據自己開發環境需要自己調整),將它cd到[mingw目錄]/msys/1.0,執行msys.bat。應該彈出mingw的命令列,注意關閉中文輸入法,這破命令列一輸入中文就死掉了。輸入which cl與which link兩條命令檢查一下兩個工具是否用的都是VS的。如果是的話編譯FFMPEG與X264的環境搭建就完成了。

2. 編譯X264與FFMPEG:

(如果用不到X264的朋友直接跳到2.4)

2.3:編譯X264原始碼:

2.3.1:將X264原始碼複製到[mingw目錄]/msys/1.0/中

2.3.2:用1.5中所述方法開啟msys.exe,並在msys中輸入cd /x264 (根據X264原始碼的資料夾的位置和名字自己改)

2.3.3:輸入CC=cl ./configure --enable-static --disable-opencl --disable-lavf --enable-debug --disable-asm --prefix=./VS2015_build,等待該命令執行完成(時間可能比較長)

這裡本渣渣就不是全懂了,對編譯指令的瞭解還有一定欠缺,這條命令是網上查的,大概解釋下我懂的部分

--enable-static:編譯成靜態庫,如果需要動態庫改成--enable-shared

--enable-debug:開啟除錯,這樣可以單步除錯進x264原始碼

--disable-asm:沒明白為什麼不是--disable-yasm?,但是這麼寫也沒啥問題

--prefix=./VS2015_build:把編譯好的標頭檔案和庫檔案放在./VS2015_build中,這個目錄會在編譯後自己建立。

大佬們可以./configure --help>output.txt 去檢視更詳細的資訊,本英語渣&&計算機渣就繞過了

2.3.4:輸入make,等待編譯完成。

2.3.5:輸入make install,等待安裝完成。

到這裡如果順利的話可以到[mingw目錄]/msys/1.0/x264/VS2015_build/inlcude裡面發現兩個標頭檔案,以及[mingw目錄]/msys/1.0/x264/VS2015_build/lib裡面發現libx264.lib的庫檔案

到這裡X264編譯安裝完成。

2.4:編譯FFMPEG原始碼:

2.4.1:開啟mingw並切換目錄到ffmpeg下(參考2.3)

2.4.2:輸入./configure --enable-debug --disable-optimizations --enable-libx264 --disable-libspeex --enable-nonfree --enable-gpl --disable-shared --enable-static --disable-yasm --prefix=./VS2015_build --toolchain=msvc --extra-ldflags=-LIBPATH:C:/MinGW/msys/1.0/x264/VS_2015_build/lib --extra-cflags=-IC:/MinGW/msys/1.0/x264/VS_2015_build/include

這條指令執行時間也很長,同樣挑其中幾條我懂的來說:

--enable-debug:開啟除錯功能,可單步執行進ffmpeg

--disable-optimizations:關閉彙編優化,如果不寫這個很多程式碼會被彙編優化掉,以至於單步除錯時可能會跳過一些程式碼,雖然加了這個也會有這個問題,但會好很多。

--enable-libx264 --enable-gpl --extra-ldflags=[目錄] --extra-cflags=-I[目錄]:不用X264的可以不寫這四個

--disable-shared --enable-static:編譯成靜態庫,如果要編譯成動態庫就把enable與disable換一換

--disable-yasm:部分函式不用匯編程式碼

--prefix=./VS2015_build:安裝到這個目錄

2.4.3:make與make install:make時間比較長,特別注意如果用VS中文版編譯的話可能會報語法錯,解決方法是找到config.h這個檔案,找到#define CC_IDENT 後面那個字串,要把裡面中文改成英文或刪掉。如果用其他編譯器也要注意所用的編譯器是否支援C99語法以及生成的標頭檔案中是否有中文。

make install完成後會發現VS2015_build目錄下有include和lib資料夾,其中分別有對應標頭檔案和靜態庫,到這裡FFMPEG與X264編譯完成。

3. VS下執行與除錯:

3.1:對於需要用ffmpeg的VS專案,我們告訴VS專案標頭檔案和庫檔案在哪裡

VS載入庫檔案的方法大概有三種:1. 直接新增進專案2. 預編譯指令 3. 修改專案屬性

這裡只講第一種:

3.1.1:在專案-->屬性-->VC++目錄-->包含目錄中新增剛剛ffmpeg與x264編譯好的include資料夾

分別位於

[mingw目錄]/msys/1.0/ffmpeg/VS2015_build/include

[mingw目錄]/msys/1.0/x264/VS2015_build/include


3.1.2 專案-->新建篩選器:隨便起個名字,用於放庫檔案,比如就叫"庫檔案"


3.1.3 右鍵庫檔案-->新增現有項:然後把ffmpeg和x264裡面的lib目錄下的*.lib檔案和*.a檔案全部新增進來

3.1.4 試著編譯執行一個example看看,如果是VS2013以上版本記得關SDL檢查

#ifdef __cplusplus
extern "C"
{
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <libavcodec/avcodec.h>
#include<x264.h>
#include<x264_config.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
#include "libavcodec\avcodec.h"  
#include "libavformat\avformat.h"  
#include "libavutil\channel_layout.h"  
#include "libavutil\common.h"  
#include "libavutil\imgutils.h"  
#include "libswscale\swscale.h"   
#include "libavutil\imgutils.h"      
#include "libavutil\opt.h"         
#include "libavutil\mathematics.h"      
#include "libavutil\samplefmt.h"  

#ifdef __cplusplus
}
#endif

int main()
{
    av_register_all();
    return 0;
}

如果OK了,當然萬事大吉,但是實際操作中VS報了一堆的link error;

3.1.5: link error 解決方案:

首先要確認你的link error來自哪裡,如果是來自main函式,比如說找不到符號 __av_register_all,那麼先返回3.1.3檢視你的庫檔案是否正常載入進來了,然後檢查VS的開發環境是否和ffmpeg編譯環境一致。如果不一致需要在這個位置調整。

如果還是不行,可以嘗試一下其他的載入靜態庫的方案。

如果link error來自ffmpeg的庫檔案,則需要把ffmpeg中需要的依賴庫一併載入到專案中,具體有哪些依賴庫請參考後文QT下執行與除錯,通過新增現有項的方法把那些庫載入進專案就OK了。

4. QT下執行與除錯:

4.1:下載QT:注意下載QT的版本是x86或是x64的一定要和編譯好的ffmpeg與x264是一致的,x86的ffmpeg無論如何也是不可能在64位QT下跑起來的。

QT下載傳送門:http://download.qt.io/archive/qt/

4.2:對於QT專案,我們需要編輯*.pro檔案來告訴QT我們標頭檔案目錄和依賴的庫在哪裡,QT並不會自動載入windows的系統庫(VS會載入一部分),所以我們需要把它所有的依賴庫都寫上

INCLUDEPATH+= C:/MinGW/msys/1.0/ffmpeg/VS2015_build/include\
              C:/MinGW/msys/1.0/x264/VS_2015_build/include


LIBS+=C:/MinGW/msys/1.0/ffmpeg/VS2015_build/lib/libavcodec.a\
      C:/MinGW/msys/1.0/ffmpeg/VS2015_build/lib/libavdevice.a\
      C:/MinGW/msys/1.0/ffmpeg/VS2015_build/lib/libavfilter.a\
      C:/MinGW/msys/1.0/ffmpeg/VS2015_build/lib/libavformat.a\
      C:/MinGW/msys/1.0/ffmpeg/VS2015_build/lib/libavutil.a\
      C:/MinGW/msys/1.0/ffmpeg/VS2015_build/lib/libpostproc.a\
      C:/MinGW/msys/1.0/ffmpeg/VS2015_build/lib/libswresample.a\
      C:/MinGW/msys/1.0/ffmpeg/VS2015_build/lib/libswscale.a\
      C:/MinGW/msys/1.0/x264/VS_2015_build/lib/libx264.lib\
      "C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x86/ole32.lib"\
      "C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x86/AdvAPI32.Lib"\
      "C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x86/User32.Lib"\
      "C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x86/WS2_32.Lib"\
      "C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x86/Secur32.Lib"

其中ole32.lib,AdvAPI32.lib,User32.lib,WS2_32.lib,Secur32.lib為ffmpeg自己需要的系統庫。

如果安裝的是64位的ffmpeg,出現link,error,同理需要去搜索找不到的符號在哪一個系統庫下,並把它載入進專案。

編譯成功,即可單步除錯。

5. 參考文章:

大家如果有還有問題解決不了也可以去看看下面這篇文章,感覺講的比我專業多了