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 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 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上述指令碼執行完城後,生成simplest_ffmpeg_player.exe。
b) 使用SDL類庫的時候,務必設定/MD選項(使用動態連結的庫)
c) 使用SDL類庫的時候,務必設定/SUBSYSTEM:WINDOWS
d) 使用FFmpeg類庫的時候,務必設定/OPT:NOREF
完整的指令碼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
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 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 ..
#=====================================================================================