FFmpeg示例程序合集-批量编译脚本
simplest ffmpeg player: ? ? ? ? ? ? ? ? ?最簡(jiǎn)單的基于FFmpeg的視頻播放器
simplest ffmpeg audio player: ? ? ? 最簡(jiǎn)單的基于FFmpeg的音頻播放器
simplest ffmpeg pic encoder: ? ? ? ?最簡(jiǎn)單的基于FFmpeg的圖像編碼器
simplest ffmpeg video encoder: ? ?最簡(jiǎn)單的基于FFmpeg的視頻編碼器
simplest ffmpeg audio encoder: ? 最簡(jiǎn)單的基于FFmpeg的音頻編碼器
simplest ffmpeg streamer: ? ? ? ? ? ? 最簡(jiǎn)單的基于FFmpeg的推流器(推送RTMP)
simplest ffmpeg mem handler: ? ? 最簡(jiǎn)單的基于FFmpeg的內(nèi)存讀寫例子
simplest ffmpeg device: ? ? ? ? ? ? ? ? 最簡(jiǎn)單的基于FFmpeg的AVDevice例子
simplest ffmpeg format: ? ? ? ? ? ? ? ? 最簡(jiǎn)單的基于FFmpeg的封裝格式方面的例子
simplest ffmpeg video filter: ? ? ? ? ?最簡(jiǎn)單的基于FFmpeg的AVfilter例子(水印疊加)
simplest ffmpeg swscale: ? ? ? ? ? ? 最簡(jiǎn)單的基于FFmpeg的libswscale的示例
?
開(kāi)始的時(shí)候,我只是在VC2010下調(diào)試通過(guò)了這些程序。去年就有不少朋友跟我提建議希望能把代碼改成跨平臺(tái)的。后來(lái)我調(diào)查了一下也發(fā)現(xiàn)FFmpeg確實(shí)在各個(gè)平臺(tái)都有廣泛的應(yīng)用,因此也產(chǎn)生了把代碼改成跨平臺(tái)的意愿。但是改成跨平臺(tái)代碼的工作量比較大,所以一直也沒(méi)有做出實(shí)際行動(dòng)。今年春節(jié)前夕可算是得到了一陣相對(duì)自由的時(shí)間,于是果斷進(jìn)行了一陣子“連續(xù)戰(zhàn)斗”,終于實(shí)現(xiàn)了這些工程在VC++,cl.exe,MinGW,Linux GCC以及MacOS GCC上面順利的編譯。在這個(gè)過(guò)程中,也寫了各種編譯器的編譯腳本,在這里記錄一下。
本文記錄以下幾種編譯腳本:
VC++:simplest_ffmpeg_demos_compile_devenv_all.bat
CL.exe:simplest_ffmpeg_demos_compile_cl_all.bat
MinGW:simplest_ffmpeg_demos_compile_mingw_all.sh
GCC (Linux/MacOS):simplest_ffmpeg_demos_compile_gcc_all.sh
? ? ? ???? ? ? ? ? ? ?? ? ? ? ? ?
下載地址:【Github】 https://github.com/leixiaohua1020/leixiaohua1020.github.io/tree/master/batch
?
準(zhǔn)備工作
在記錄具體的編譯腳本之前,首先簡(jiǎn)單記錄一下在不同平臺(tái)下編譯這些FFmpeg工程需要做的準(zhǔn)備工作。注意這一步驟針對(duì)的是一臺(tái)完全空白未做任何配置的“裸機(jī)”。如果已經(jīng)編譯安裝過(guò)FFmpeg,就可以直接跳過(guò)這一步驟。
PS:一些示例程序需要安裝SDL2,方法類似,不再記錄。
VC++
VC++的編譯是最簡(jiǎn)單的,相關(guān)的include和lib都已經(jīng)配置好了,可以直接編譯運(yùn)行。
CL.exe
基本上等同于使用VC++編譯,可以直接編譯運(yùn)行。
MinGW
兩種方法:直接安裝和源代碼編譯
直接安裝
(1)從FFmpeg Windows Build (http://ffmpeg.zeranoe.com/) 網(wǎng)站下載最新的shared 和dev版本的FFmpeg。
(2)在Msys安裝目錄下創(chuàng)建“l(fā)ocal”文件夾,“l(fā)ocal”文件夾下創(chuàng)建“include”和“l(fā)ib”文件夾。
(3)將FFmpeg的dev版本下的include拷貝至{msys}/local/include;lib拷貝至{msys}/local/lib。
(4)將FFmpeg的shared版本下的Dll拷貝至{mingw}/bin。
源代碼編譯
(1)安裝Yasm
從官網(wǎng)下載yasmXXX.exe,然后重命名為yasm.exe,拷貝至{mingw}/bin
PS:也可以下載源代碼自己編譯,稍微麻煩些,不再記錄。
(2)編譯安裝SDL
PS:注意SDL的安裝路徑如果沒(méi)有安裝在{msys}/local目錄下的話,configure的時(shí)候設(shè)置一下。
(3)編譯安裝libx264
(3)編譯安裝libfaac
(4)編譯安裝FFmpeg
[plain] view plaincopy
Linux
(0)前期準(zhǔn)備
某些Linux沒(méi)有安裝gcc/g++,需要先安裝gcc/g++
進(jìn)入超級(jí)管理員“su”
(1)安裝相關(guān)的類庫(kù)
[Debian/Ubuntu]
PS:這些類庫(kù)也可以下載源代碼手動(dòng)編譯,稍微麻煩些,不再記錄。
[RedHat/Fedora/CentOS]
需要手動(dòng)編譯每個(gè)類庫(kù)
(2)編譯安裝FFmpeg
[plain] view plaincopy
MacOS
兩種方法:直接安裝和源代碼編譯
直接安裝
(1)安裝Homebrew
[plain] view plaincopy(2)安裝FFmpeg
[plain] view plaincopy
源代碼編譯
(1)安裝Homebrew
[plain] view plaincopy(2)安裝相關(guān)的類庫(kù)
[plain] view plaincopy(3)編譯安裝FFmpeg
進(jìn)入超級(jí)管理員“su”
[plain] view plaincopy
VC++
[plain] view plaincopy
[plain] view plaincopy
(1) ? ? ? 批處理調(diào)用VC++設(shè)置環(huán)境的腳本,例如對(duì)于VC2010來(lái)說(shuō),位于“D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat”
(2) ? ? ? 在“Visual Studio 命令提示符”中運(yùn)行批處理(或者編譯命令)。“Visual Studio 命令提示符”位于伴隨著VC++安裝,位于“Visual Studio Tools”目錄下。
?
完整的腳本simplest_ffmpeg_demos_compile_devenv_all.bat如下所示。將腳本拷貝至《最簡(jiǎn)單的FFmpeg示例程序合集》所在目錄運(yùn)行,就可以編譯所有項(xiàng)目的Release版本和Debug版本,并且輸出相關(guān)的編譯日志。
?
[plain] view plaincopy
?
CL.exe
[plain] view plaincopy
編譯包含類庫(kù)的程序相對(duì)來(lái)說(shuō)要復(fù)雜一些,下面以Simplest FFmpeg Player為例看一下它的編譯腳本。Simplest FFmpeg Player使用CL.exe編譯的腳本保存在“compile_cl.bat”文件中,如下所示。
[plain] view plaincopy
這個(gè)腳本按照順序做了以下幾點(diǎn)工作:
(1)設(shè)置VC++運(yùn)行環(huán)境。這一步通過(guò)call "D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"實(shí)現(xiàn)。
(2)設(shè)置include目錄。這一步設(shè)置FFmpeg以及SDL2的頭文件所在的目錄,通過(guò)修改include環(huán)境變量實(shí)現(xiàn)(在include環(huán)境變量前面加上項(xiàng)目文件夾中的“include”目錄)。
(3)設(shè)置lib目錄。這一步設(shè)置FFmpeg以及SDL2的庫(kù)文件所在的目錄,通過(guò)修改lib環(huán)境變量實(shí)現(xiàn)(在lib環(huán)境變量前面加上項(xiàng)目文件夾中的“l(fā)ib”目錄)。
(4) 編譯和鏈接。這一步用于將simplest_ffmpeg_player.cpp編譯生成simplest_ffmpeg_player.exe。在這里需要注意幾點(diǎn):
a) 鏈接類庫(kù)使用/link
b) 使用SDL類庫(kù)的時(shí)候,務(wù)必設(shè)置/MD選項(xiàng)(使用動(dòng)態(tài)鏈接的庫(kù))
c) ?使用SDL類庫(kù)的時(shí)候,務(wù)必設(shè)置/SUBSYSTEM:WINDOWS
d) ?使用FFmpeg類庫(kù)的時(shí)候,務(wù)必設(shè)置/OPT:NOREF 上述腳本運(yùn)行完城后,生成simplest_ffmpeg_player.exe。
?
完整的腳本simplest_ffmpeg_demos_compile_cl_all.bat如下所示。將腳本拷貝至《最簡(jiǎn)單的FFmpeg示例程序合集》所在目錄運(yùn)行,就可以編譯所有的示例程序。注意這個(gè)腳本只是分別調(diào)用了各個(gè)程序目錄下的compile_cl.bat文件。
?
[plain] view plaincopy
?
MinGW
[plain] view plaincopy
編譯包含類庫(kù)的程序相對(duì)來(lái)說(shuō)要復(fù)雜一些,下面以Simplest FFmpeg Player為例看一下它的編譯腳本。Simplest FFmpeg Player使用MinGW GCC編譯的腳本保存在“compile_mingw.sh”文件中,如下所示。
[plain] view plaincopy
這個(gè)腳本使用MinGW中的g++完成編譯。在這里要注意一點(diǎn),并不是gcc只能編譯c代碼,g++只能編譯c++代碼,而是gcc和g++都可以編譯C和C++代碼。源代碼文件后綴為.c的,gcc把它當(dāng)作是C程序,而g++當(dāng)作是c++程序;后綴為.cpp的,兩者都會(huì)認(rèn)為是c++程序。上述編譯命令有以下幾點(diǎn)需要注意:
(a) ?include目錄設(shè)置為/usr/local/include,要確保SDL2和FFmpeg的頭文件都安裝在這個(gè)目錄里(SDL2有可能沒(méi)有安裝在這里)
(b) ?lib目錄設(shè)置為/usr/local/lib,要確保SDL2和FFmpeg的庫(kù)文件都安裝在這個(gè)目錄里(SDL2有可能沒(méi)有安裝在這里)
(c) ?使用SDL類庫(kù)的時(shí)候,務(wù)必鏈接-lmingw32
上述腳本運(yùn)行完城后,生成simplest_ffmpeg_player.exe。
?
完整的腳本simplest_ffmpeg_demos_compile_mingw_all.sh如下所示。將腳本拷貝至《最簡(jiǎn)單的FFmpeg示例程序合集》所在目錄運(yùn)行,就可以編譯所有的示例程序。注意這個(gè)腳本只是分別調(diào)用了各個(gè)程序目錄下的compile_mingw.sh文件。
?
[plain] view plaincopy
?
GCC (Linux/MacOS)
? ? ? ??? ? ? ??
[plain] view plaincopy
編譯包含類庫(kù)的程序相對(duì)來(lái)說(shuō)要復(fù)雜一些,下面以Simplest FFmpeg Player為例看一下它的編譯腳本。Simplest FFmpeg Player使用GCC編譯的腳本保存在“compile_gcc.sh”文件中,如下所示。
[plain] view plaincopy
這個(gè)腳本使用gcc完成編譯。上文中已經(jīng)提到過(guò)一次,并不是gcc只能編譯c代碼,g++只能編譯c++代碼,而是gcc和g++都可以編譯C和C++代碼。源代碼文件后綴為.c的,gcc把它當(dāng)作是C程序,而g++當(dāng)作是c++程序;后綴為.cpp的,兩者都會(huì)認(rèn)為是c++程序。上述編譯命令有以下幾點(diǎn)需要注意:
(a) ?include目錄設(shè)置為/usr/local/include,要確保SDL2和FFmpeg的頭文件都安裝在這個(gè)目錄里
(b) ?lib目錄設(shè)置為/usr/local/lib,要確保SDL2和FFmpeg的庫(kù)文件都安裝在這個(gè)目錄里
(c) ?有些版本中的Linux可能沒(méi)有安裝gcc/g++編譯器,需要先裝好這兩個(gè)編譯器
上述腳本運(yùn)行完城后,生成simplest_ffmpeg_player.out。
?
注意事項(xiàng):Linux和MacOS的不同
Linux和MacOS在SDL1.2的使用上有很大的不同。在MacOS下使用SDL1.2必須加上“-framework Cocoa”參數(shù),否則編譯會(huì)出現(xiàn)錯(cuò)誤。因此在MacOS下編譯使用SDL1.2的程序的時(shí)候,編譯命令如下所示(以simplest_ffmpeg_grabdesktop為例,該程序采用了SDL1.2)。[plain] view plaincopy
此外,Linux和MacOS在顯示上也有較大的不同。此前發(fā)現(xiàn)Windows和MacOS下可以正常顯示的程序在Ubuntu下卻會(huì)出現(xiàn)“綠屏”現(xiàn)象。不過(guò)隨著代碼的調(diào)整這一情況已經(jīng)被消除了。
?
完整的腳本simplest_ffmpeg_demos_compile_gcc_all.sh如下所示。將腳本拷貝至《最簡(jiǎn)單的FFmpeg示例程序合集》所在目錄運(yùn)行,就可以編譯所有的示例程序。注意這個(gè)腳本只是分別調(diào)用了各個(gè)程序目錄下的compile_gcc.sh文件。
[plain] view plaincopy
總結(jié)
以上是生活随笔為你收集整理的FFmpeg示例程序合集-批量编译脚本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。