1. 程式人生 > >FFmpeg示例程式合集-批量編譯指令碼

FFmpeg示例程式合集-批量編譯指令碼

此前做了一系列有關FFmpeg的示例程式,組成了《最簡單的FFmpeg示例程式合集》,其中包含了如下專案:
simplest ffmpeg player:                  最簡單的基於FFmpeg的視訊播放器
simplest ffmpeg audio player:       最簡單的基於FFmpeg的音訊播放器
simplest ffmpeg pic encoder:        最簡單的基於FFmpeg的影象編碼器
simplest ffmpeg video encoder:    最簡單的基於FFmpeg的視訊編碼器
simplest ffmpeg audio encoder:   最簡單的基於FFmpeg的音訊編碼器
simplest ffmpeg streamer:             最簡單的基於FFmpeg的推流器(推送RTMP)
simplest ffmpeg mem handler:     最簡單的基於FFmpeg的記憶體讀寫例子
simplest ffmpeg device:                 最簡單的基於FFmpeg的AVDevice例子
simplest ffmpeg format:                 最簡單的基於FFmpeg的封裝格式方面的例子
simplest ffmpeg video filter:          最簡單的基於FFmpeg的AVfilter例子(水印疊加)
simplest ffmpeg swscale:             最簡單的基於FFmpeg的libswscale的示例
 
開始的時候,我只是在VC2010下除錯通過了這些程式。去年就有不少朋友跟我提建議希望能把程式碼改成跨平臺的。後來我調查了一下也發現FFmpeg確實在各個平臺都有廣泛的應用,因此也產生了把程式碼改成跨平臺的意願。但是改成跨平臺程式碼的工作量比較大,所以一直也沒有做出實際行動。今年春節前夕可算是得到了一陣相對自由的時間,於是果斷進行了一陣子“連續戰鬥”,終於實現了這些工程在VC++,cl.exe,MinGW,Linux GCC以及MacOS GCC上面順利的編譯。在這個過程中,也寫了各種編譯器的編譯指令碼,在這裡記錄一下。
本文記錄以下幾種編譯指令碼:
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

準備工作

在記錄具體的編譯指令碼之前,首先簡單記錄一下在不同平臺下編譯這些FFmpeg工程需要做的準備工作。注意這一步驟針對的是一臺完全空白未做任何配置的“裸機”。如果已經編譯安裝過FFmpeg,就可以直接跳過這一步驟。

PS:一些示例程式需要安裝SDL2,方法類似,不再記錄。

VC++

VC++的編譯是最簡單的,相關的include和lib都已經配置好了,可以直接編譯執行。

CL.exe

基本上等同於使用VC++編譯,可以直接編譯執行。

MinGW

兩種方法:直接安裝和原始碼編譯

直接安裝

(1)從FFmpeg Windows Build (http://ffmpeg.zeranoe.com/) 網站下載最新的shared 和dev版本的FFmpeg。

(2)在Msys安裝目錄下建立“local”資料夾,“local”資料夾下建立“include”和“lib”資料夾。

(3)將FFmpeg的dev版本下的include拷貝至{msys}/local/include;lib拷貝至{msys}/local/lib。

(4)將FFmpeg的shared版本下的Dll拷貝至{mingw}/bin。

原始碼編譯

(1)安裝Yasm

從官網下載yasmXXX.exe,然後重新命名為yasm.exe,拷貝至{mingw}/bin

PS:也可以下載原始碼自己編譯,稍微麻煩些,不再記錄。

(2)編譯安裝SDL

PS:注意SDL的安裝路徑如果沒有安裝在{msys}/local目錄下的話,configure的時候設定一下。

(3)編譯安裝libx264

(3)編譯安裝libfaac

(4)編譯安裝FFmpeg

./configure --enable-shared --enable-libfaac --enable-libx264 --enable-gpl --enable-nonfree
make
make install

Linux

(0)前期準備

某些Linux沒有安裝gcc/g++,需要先安裝gcc/g++

進入超級管理員“su”

(1)安裝相關的類庫

[Debian/Ubuntu]

apt-get -y install yasm libfaac-dev libx264-dev libsdl1.2-dev

PS:這些類庫也可以下載原始碼手動編譯,稍微麻煩些,不再記錄。

[RedHat/Fedora/CentOS]

需要手動編譯每個類庫

(2)編譯安裝FFmpeg

./configure --enable-shared --enable-libfaac --enable-libx264 --enable-gpl --enable-nonfree
make
make install

MacOS

兩種方法:直接安裝和原始碼編譯

直接安裝

(1)安裝Homebrew

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

(2)安裝FFmpeg

brew install ffmpeg

原始碼編譯

(1)安裝Homebrew

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

(2)安裝相關的類庫

brew install yasm faac x264 sdl

(3)編譯安裝FFmpeg

進入超級管理員“su”

./configure --enable-shared --enable-libfaac --enable-libx264 --enable-gpl --enable-nonfree
make
make install

VC++


使用devenv.exe進行編譯是最簡單的一種命令列編譯方式。這種編譯方式和使用VC++代開*.sln解決方案檔案然後單擊“編譯”按鈕的效果是一樣的。由於專案解決方案中已經做過了include,lib以及相關選項的設定,所以不需要做各種引數的配置。下面這條命令編譯Debug版本程式:
devenv.exe simplest_ffmpeg_player2.sln /rebuild Debug
下面這條命令編譯生成Release版本程式,同時將編譯過程中的日誌輸出到“sf_player_release_ compile_log.txt”檔案中:
devenv.exe simplest_ffmpeg_player2.sln /rebuild Release /Out sf_player_release_ compile_log.txt
使用devenv進行編譯的時候,需要VC++執行環境,有2種方法可以設定:
(1)       批處理呼叫VC++設定環境的指令碼,例如對於VC2010來說,位於“D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat”
(2)       在“Visual Studio 命令提示符”中執行批處理(或者編譯命令)。“Visual Studio 命令提示符”位於伴隨著VC++安裝,位於“Visual Studio Tools”目錄下。
 
完整的指令碼simplest_ffmpeg_demos_compile_devenv_all.bat如下所示。將指令碼拷貝至《最簡單的FFmpeg示例程式合集》所在目錄執行,就可以編譯所有專案的Release版本和Debug版本,並且輸出相關的編譯日誌。
 
@echo off
echo ---------------------------------------------
echo simplest ffmpeg demos list ---- Devenv compile all
echo Lei Xiaohua
echo Communication University of China / Digital TV Technology
echo [email protected]
echo http://blog.csdn.net/leixiaohua1020
echo ---------------------------------------------
 
set logfile=compile_log.txt
::VS2010 Environment
call "D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_player...
cd simplest_ffmpeg_player
devenv.exe simplest_ffmpeg_player2.sln /rebuild Debug /Out ../sf_player_debug_%logfile%
devenv.exe simplest_ffmpeg_player2.sln /rebuild Release /Out ../sf_player_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_audio_player...
cd simplest_ffmpeg_audio_player
devenv.exe simplest_ffmpeg_audio_player2.sln /rebuild Debug /Out ../sf_audio_player_debug_%logfile%
devenv.exe simplest_ffmpeg_audio_player2.sln /rebuild Release /Out ../sf_audio_player_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_picture_encoder...
cd simplest_ffmpeg_picture_encoder
devenv.exe simplest_ffmpeg_picture_encoder.sln /rebuild Debug /Out ../sf_picture_encoder_debug_%logfile%
devenv.exe simplest_ffmpeg_picture_encoder.sln /rebuild Release /Out ../sf_picture_encoder_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_video_encoder...
cd simplest_ffmpeg_video_encoder
devenv.exe simplest_ffmpeg_video_encoder.sln /rebuild Debug /Out ../sf_video_encoder_debug_%logfile%
devenv.exe simplest_ffmpeg_video_encoder.sln /rebuild Release /Out ../sf_video_encoder_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_audio_encoder...
cd simplest_ffmpeg_audio_encoder
devenv.exe simplest_ffmpeg_audio_encoder.sln /rebuild Debug /Out ../sf_audio_encoder_debug_%logfile%
devenv.exe simplest_ffmpeg_audio_encoder.sln /rebuild Release /Out ../sf_audio_encoder_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_streamer...
cd simplest_ffmpeg_streamer
devenv.exe simplest_ffmpeg_streamer.sln /rebuild Debug /Out ../sf_streamer_debug_%logfile%
devenv.exe simplest_ffmpeg_streamer.sln /rebuild Release /Out ../sf_streamer_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_mem_handler...
cd simplest_ffmpeg_mem_handler
devenv.exe simplest_ffmpeg_mem_handler.sln /rebuild Debug /Out ../sf_mem_handler_debug_%logfile%
devenv.exe simplest_ffmpeg_mem_handler.sln /rebuild Release /Out ../sf_mem_handler_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_device...
cd simplest_ffmpeg_device
devenv.exe simplest_ffmpeg_device.sln /rebuild Debug /Out ../sf_device_debug_%logfile%
devenv.exe simplest_ffmpeg_device.sln /rebuild Release /Out ../sf_device_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_format...
cd simplest_ffmpeg_format
devenv.exe simplest_ffmpeg_format.sln /rebuild Debug /Out ../sf_format_debug_%logfile%
devenv.exe simplest_ffmpeg_format.sln /rebuild Release /Out ../sf_format_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_video_filter...
cd simplest_ffmpeg_video_filter
devenv.exe simplest_ffmpeg_video_filter.sln /rebuild Debug /Out ../sf_video_filter_debug_%logfile%
devenv.exe simplest_ffmpeg_video_filter.sln /rebuild Release /Out ../sf_video_filter_release_%logfile%
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_swscale...
cd simplest_ffmpeg_swscale
devenv.exe simplest_ffmpeg_swscale.sln /rebuild Debug /Out ../sf_swscale_debug_%logfile%
devenv.exe simplest_ffmpeg_swscale.sln /rebuild Release /Out ../sf_swscale_release_%logfile%
cd ..
 
::=====================================================================================

 

CL.exe


cl.exe 是Microsoft C/C++編譯器,和GCC屬於同一個層面的東西。一個基本的呼叫cl.exe編譯的命令列如下所示:
cl.exe helloworld.cpp
上述命令執行完後即可在同一目錄下生成一個helloworld.exe的可執行程式。
編譯包含類庫的程式相對來說要複雜一些,下面以Simplest FFmpeg Player為例看一下它的編譯指令碼。Simplest FFmpeg Player使用CL.exe編譯的指令碼儲存在“compile_cl.bat”檔案中,如下所示。
::最簡單的基於FFmpeg的視訊播放器 2----命令列編譯
::Simplest FFmpeg Player 2----Compile in Cmd
::
::雷霄驊 Lei Xiaohua
::[email protected]
::中國傳媒大學/數字電視技術
::Communication University of China / Digital TV Technology
::http://blog.csdn.net/leixiaohua1020
::
::VS2010 Environment
call "D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
::include
@set INCLUDE=include;%INCLUDE%
::lib
@set LIB=lib;%LIB%
::compile and link
cl simplest_ffmpeg_player.cpp /MD /link SDL2.lib SDL2main.lib avcodec.lib ^
avformat.lib avutil.lib avdevice.lib avfilter.lib postproc.lib swresample.lib swscale.lib ^
/SUBSYSTEM:WINDOWS /OPT:NOREF
exit

這個指令碼按照順序做了以下幾點工作:
(1)設定VC++執行環境。這一步通過call "D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"實現。
(2)設定include目錄。這一步設定FFmpeg以及SDL2的標頭檔案所在的目錄,通過修改include環境變數實現(在include環境變數前面加上專案資料夾中的“include”目錄)。
(3)設定lib目錄。這一步設定FFmpeg以及SDL2的庫檔案所在的目錄,通過修改lib環境變數實現(在lib環境變數前面加上專案資料夾中的“lib”目錄)。
(4) 編譯和連結。這一步用於將simplest_ffmpeg_player.cpp編譯生成simplest_ffmpeg_player.exe。在這裡需要注意幾點:
a) 連結類庫使用/link
b) 使用SDL類庫的時候,務必設定/MD選項(使用動態連結的庫)
c)  使用SDL類庫的時候,務必設定/SUBSYSTEM:WINDOWS
d)  使用FFmpeg類庫的時候,務必設定/OPT:NOREF
上述指令碼執行完城後,生成simplest_ffmpeg_player.exe。
 
完整的指令碼simplest_ffmpeg_demos_compile_cl_all.bat如下所示。將指令碼拷貝至《最簡單的FFmpeg示例程式合集》所在目錄執行,就可以編譯所有的示例程式。注意這個指令碼只是分別呼叫了各個程式目錄下的compile_cl.bat檔案。
 
@echo off
echo ---------------------------------------------
echo simplest ffmpeg demos list ---- CL compile all
echo Lei Xiaohua
echo Communication University of China / Digital TV Technology
echo [email protected]
echo http://blog.csdn.net/leixiaohua1020
echo ---------------------------------------------
::=====================================================================================
 
echo.
echo Compile simplest_ffmpeg_player...
cd simplest_ffmpeg_player
cd simplest_ffmpeg_player
start /wait compile_cl.bat
cd ..
cd simplest_ffmpeg_player_su
start /wait compile_cl.bat
cd ..
cd simplest_ffmpeg_decoder_pure
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_audio_player...
cd simplest_ffmpeg_audio_player
cd simplest_ffmpeg_audio_player
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_picture_encoder...
cd simplest_ffmpeg_picture_encoder
cd simplest_ffmpeg_picture_encoder
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_video_encoder...
cd simplest_ffmpeg_video_encoder
cd simplest_ffmpeg_video_encoder
start /wait compile_cl.bat
cd ..
cd simplest_ffmpeg_video_encoder_pure
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_audio_encoder...
cd simplest_ffmpeg_audio_encoder
cd simplest_ffmpeg_audio_encoder
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_streamer...
cd simplest_ffmpeg_streamer
cd simplest_ffmpeg_streamer
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_mem_handler...
cd simplest_ffmpeg_mem_handler
cd simplest_ffmpeg_mem_player
start /wait compile_cl.bat
cd ..
cd simplest_ffmpeg_mem_transcoder
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_device...
cd simplest_ffmpeg_device
cd simplest_ffmpeg_grabdesktop
start /wait compile_cl.bat
cd ..
cd simplest_ffmpeg_readcamera
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_format...
cd simplest_ffmpeg_format
cd simplest_ffmpeg_demuxer
start /wait compile_cl.bat
cd ..
cd simplest_ffmpeg_demuxer_simple
start /wait compile_cl.bat
cd ..
cd simplest_ffmpeg_muxer
start /wait compile_cl.bat
cd ..
cd simplest_ffmpeg_remuxer
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_video_filter...
cd simplest_ffmpeg_video_filter
cd simplest_ffmpeg_video_filter
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================
echo.
echo Compile simplest_ffmpeg_swscale...
cd simplest_ffmpeg_swscale
cd simplest_ffmpeg_swscale
start /wait compile_cl.bat
cd ..
cd simplest_pic_gen
start /wait compile_cl.bat
cd ..
cd ..
 
::=====================================================================================


 

MinGW


MinGW是Windows下的GCC/G++編譯器。使用MinGW編譯需要執行其安裝目錄下的msys.bat設定其環境變數。一個基本的呼叫MinGW gcc編譯的命令列如下所示:
gcc helloworld.cpp -o helloworld.exe
上述命令執行完後即可在同一目錄下生成一個helloworld.exe的可執行程式。
編譯包含類庫的程式相對來說要複雜一些,下面以Simplest FFmpeg Player為例看一下它的編譯指令碼。Simplest FFmpeg Player使用MinGW GCC編譯的指令碼儲存在“compile_mingw.sh”檔案中,如下所示。
#! /bin/sh
#最簡單的基於FFmpeg的視訊播放器 2----MinGW命令列編譯
#Simplest FFmpeg Player 2----Compile in MinGW
#
#雷霄驊 Lei Xiaohua
#[email protected]
#中國傳媒大學/數字電視技術
#Communication University of China / Digital TV Technology
#http://blog.csdn.net/leixiaohua1020
#
#compile
g++ simplest_ffmpeg_player.cpp -g -o simplest_ffmpeg_player.exe \
-I /usr/local/include -L /usr/local/lib \
-lmingw32 -lSDL2main -lSDL2 -lavformat -lavcodec -lavutil -lswscale
 
這個指令碼使用MinGW中的g++完成編譯。在這裡要注意一點,並不是gcc只能編譯c程式碼,g++只能編譯c++程式碼,而是gcc和g++都可以編譯C和C++程式碼。原始碼檔案字尾為.c的,gcc把它當作是C程式,而g++當作是c++程式;字尾為.cpp的,兩者都會認為是c++程式。上述編譯命令有以下幾點需要注意:
(a)  include目錄設定為/usr/local/include,要確保SDL2和FFmpeg的標頭檔案都安裝在這個目錄裡(SDL2有可能沒有安裝在這裡)
(b)  lib目錄設定為/usr/local/lib,要確保SDL2和FFmpeg的庫檔案都安裝在這個目錄裡(SDL2有可能沒有安裝在這裡)
(c)  使用SDL類庫的時候,務必連結-lmingw32
上述指令碼執行完城後,生成simplest_ffmpeg_player.exe。
 
完整的指令碼simplest_ffmpeg_demos_compile_mingw_all.sh如下所示。將指令碼拷貝至《最簡單的FFmpeg示例程式合集》所在目錄執行,就可以編譯所有的示例程式。注意這個指令碼只是分別呼叫了各個程式目錄下的compile_mingw.sh檔案。
 
echo "============================================="
echo "simplest ffmpeg demos list ---- MinGW compile all"
echo "Lei Xiaohua"
echo "Communication University of China / Digital TV Technology"
echo "[email protected]"
echo "http://blog.csdn.net/leixiaohua1020"
echo "============================================="
#=====================================================================================
 
echo ""
echo "Compile simplest_ffmpeg_player..."
cd simplest_ffmpeg_player
cd simplest_ffmpeg_player
sh compile_mingw.sh
cd ..
cd simplest_ffmpeg_player_su
sh compile_mingw.sh
cd ..
cd simplest_ffmpeg_decoder_pure
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_audio_player..."
cd simplest_ffmpeg_audio_player
cd simplest_ffmpeg_audio_player
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_picture_encoder..."
cd simplest_ffmpeg_picture_encoder
cd simplest_ffmpeg_picture_encoder
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_video_encoder..."
cd simplest_ffmpeg_video_encoder
cd simplest_ffmpeg_video_encoder
sh compile_mingw.sh
cd ..
cd simplest_ffmpeg_video_encoder_pure
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_audio_encoder..."
cd simplest_ffmpeg_audio_encoder
cd simplest_ffmpeg_audio_encoder
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_streamer..."
cd simplest_ffmpeg_streamer
cd simplest_ffmpeg_streamer
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_mem_handler..."
cd simplest_ffmpeg_mem_handler
cd simplest_ffmpeg_mem_player
sh compile_mingw.sh
cd ..
cd simplest_ffmpeg_mem_transcoder
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_device..."
cd simplest_ffmpeg_device
cd simplest_ffmpeg_grabdesktop
sh compile_mingw.sh
cd ..
cd simplest_ffmpeg_readcamera
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_format..."
cd simplest_ffmpeg_format
cd simplest_ffmpeg_demuxer
sh compile_mingw.sh
cd ..
cd simplest_ffmpeg_demuxer_simple
sh compile_mingw.sh
cd ..
cd simplest_ffmpeg_muxer
sh compile_mingw.sh
cd ..
cd simplest_ffmpeg_remuxer
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_video_filter..."
cd simplest_ffmpeg_video_filter
cd simplest_ffmpeg_video_filter
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_swscale..."
cd simplest_ffmpeg_swscale
cd simplest_ffmpeg_swscale
sh compile_mingw.sh
cd ..
cd simplest_pic_gen
sh compile_mingw.sh
cd ..
cd ..
 
#=====================================================================================

 

GCC (Linux/MacOS)

                

GCC是Linux/MacOS下的C/C++編譯器。在Linux/MacOS下可以使用GCC編譯C/C++程式,一個簡單的GCC編譯命令:
gcc helloworld.cpp -o helloworld.out
上述命令執行完後即可在同一目錄下生成一個名稱為helloworld.out的可執行程式。
編譯包含類庫的程式相對來說要複雜一些,下面以Simplest FFmpeg Player為例看一下它的編譯指令碼。Simplest FFmpeg Player使用GCC編譯的指令碼儲存在“compile_gcc.sh”檔案中,如下所示。
#! /bin/sh
#最簡單的基於FFmpeg的視訊播放器 2----命令列編譯
#Simplest FFmpeg Player 2----Compile in Shell
#
#雷霄驊 Lei Xiaohua
#[email protected]
#中國傳媒大學/數字電視技術
#Communication University of China / Digital TV Technology
#http://blog.csdn.net/leixiaohua1020
#
#compile
gcc simplest_ffmpeg_player.cpp -g -o simplest_ffmpeg_player.out \
-I /usr/local/include -L /usr/local/lib -lSDL2main -lSDL2 -lavformat -lavcodec -lavutil -lswscale
 
這個指令碼使用gcc完成編譯。上文中已經提到過一次,並不是gcc只能編譯c程式碼,g++只能編譯c++程式碼,而是gcc和g++都可以編譯C和C++程式碼。原始碼檔案字尾為.c的,gcc把它當作是C程式,而g++當作是c++程式;字尾為.cpp的,兩者都會認為是c++程式。上述編譯命令有以下幾點需要注意:
(a)  include目錄設定為/usr/local/include,要確保SDL2和FFmpeg的標頭檔案都安裝在這個目錄裡
(b)  lib目錄設定為/usr/local/lib,要確保SDL2和FFmpeg的庫檔案都安裝在這個目錄裡
(c)  有些版本中的Linux可能沒有安裝gcc/g++編譯器,需要先裝好這兩個編譯器
上述指令碼執行完城後,生成simplest_ffmpeg_player.out。
 

注意事項:Linux和MacOS的不同

Linux和MacOS在SDL1.2的使用上有很大的不同。在MacOS下使用SDL1.2必須加上“-framework Cocoa”引數,否則編譯會出現錯誤。因此在MacOS下編譯使用SDL1.2的程式的時候,編譯命令如下所示(以simplest_ffmpeg_grabdesktop為例,該程式採用了SDL1.2)。
gcc simplest_ffmpeg_grabdesktop.cpp -g -o simplest_ffmpeg_grabdesktop.out \
-framework Cocoa -I /usr/local/include -L /usr/local/lib -lSDLmain -lSDL -lavformat -lavcodec -lavutil -lavdevice -lswscale
對於這些採用SDL1.2的程式,儲存了一個MacOS下專有的指令碼“compile_gcc_mac.sh”。
此外,Linux和MacOS在顯示上也有較大的不同。此前發現Windows和MacOS下可以正常顯示的程式在Ubuntu下卻會出現“綠屏”現象。不過隨著程式碼的調整這一情況已經被消除了。
 
完整的指令碼simplest_ffmpeg_demos_compile_gcc_all.sh如下所示。將指令碼拷貝至《最簡單的FFmpeg示例程式合集》所在目錄執行,就可以編譯所有的示例程式。注意這個指令碼只是分別呼叫了各個程式目錄下的compile_gcc.sh檔案。
echo "============================================="
echo "simplest ffmpeg demos list ---- GCC compile all"
echo "Lei Xiaohua"
echo "Communication University of China / Digital TV Technology"
echo "[email protected]"
echo "http://blog.csdn.net/leixiaohua1020"
echo "============================================="
#=====================================================================================
#OS kernel
kernel=$(uname -s)

#change the access permissions (--recursive)
chmod -R 777 ./

echo ""
echo "Compile simplest_ffmpeg_player..."
cd simplest_ffmpeg_player
cd simplest_ffmpeg_player
sh compile_gcc.sh
cd ..
cd simplest_ffmpeg_player_su
sh compile_gcc.sh
cd ..
cd simplest_ffmpeg_decoder_pure
sh compile_gcc.sh
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_audio_player..."
cd simplest_ffmpeg_audio_player
cd simplest_ffmpeg_audio_player
sh compile_gcc.sh
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_picture_encoder..."
cd simplest_ffmpeg_picture_encoder
cd simplest_ffmpeg_picture_encoder
sh compile_gcc.sh
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_video_encoder..."
cd simplest_ffmpeg_video_encoder
cd simplest_ffmpeg_video_encoder
sh compile_gcc.sh
cd ..
cd simplest_ffmpeg_video_encoder_pure
sh compile_gcc.sh
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_audio_encoder..."
cd simplest_ffmpeg_audio_encoder
cd simplest_ffmpeg_audio_encoder
sh compile_gcc.sh
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_streamer..."
cd simplest_ffmpeg_streamer
cd simplest_ffmpeg_streamer
sh compile_gcc.sh
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_mem_handler..."
cd simplest_ffmpeg_mem_handler
cd simplest_ffmpeg_mem_player
if [ "$kernel" == "Darwin" ];then
sh compile_gcc_mac.sh
else
sh compile_gcc.sh
fi
cd ..
cd simplest_ffmpeg_mem_transcoder
sh compile_gcc.sh
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_device..."
cd simplest_ffmpeg_device
cd simplest_ffmpeg_grabdesktop
if [ "$kernel" == "Darwin" ];then
sh compile_gcc_mac.sh
else
sh compile_gcc.sh
fi
cd ..
cd simplest_ffmpeg_readcamera
if [ "$kernel" == "Darwin" ];then
sh compile_gcc_mac.sh
else
sh compile_gcc.sh
fi
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_format..."
cd simplest_ffmpeg_format
cd simplest_ffmpeg_demuxer
sh compile_gcc.sh
cd ..
cd simplest_ffmpeg_demuxer_simple
sh compile_gcc.sh
cd ..
cd simplest_ffmpeg_muxer
sh compile_gcc.sh
cd ..
cd simplest_ffmpeg_remuxer
sh compile_gcc.sh
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_video_filter..."
cd simplest_ffmpeg_video_filter
cd simplest_ffmpeg_video_filter
if [ "$kernel" == "Darwin" ];then
sh compile_gcc_mac.sh
else
sh compile_gcc.sh
fi
cd ..
cd ..

#=====================================================================================
echo ""
echo "Compile simplest_ffmpeg_swscale..."
cd simplest_ffmpeg_swscale
cd simplest_ffmpeg_swscale
sh compile_gcc.sh
cd ..
cd simplest_pic_gen
sh compile_gcc.sh
cd ..
cd ..

#=====================================================================================