使用ffmpeg進行音視頻開發,首先編譯需要把ffmpeg的源碼編譯成靜態庫,編譯不是大問題,關鍵問題是編譯的時候的各種配置該怎麼設置的問題。之前在網上搜索學習,這篇文章不錯:iOS: FFmpeg編譯和使用問題總結 。有些文章給出編譯的整個命令,有的給腳本鏈接,但是都有一些問題,因為ffmpeg版本更新了、iOS版本更新了(我下的是ffmpeg2.3)。最後東拼西湊,終於編譯成功了一個,編譯命令是:
(1)
./configure --prefix=../i386 --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --enable-avresample --enable-cross-compile --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk --target-os=darwin --cc=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang --extra-cflags=-arch i386 -mfpu=neon -miphoneos-version-min=7.0 --extra-ldflags=-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk -miphoneos-version-min=7.0 --arch=i386 --cpu=i386 --enable-pic --disable-asm --enable-decoder=h264 --enable-decoder=rv40(2)
sudo make&&sudo make install
1、完整過程:
首先編譯是使用終端進行編譯,打開終端後,進入到你下載解壓後的ffmpeg的文件目錄下,然後執行上面的命令。(1)部分是配置,(2)部分 make執行後會開始編譯,會看到迅速生成許多 cc 開頭的命令;make install生成靜態庫,完成。
後面編譯完成,加到項目中也OK了,但是一看大小,我靠,200多M,沒辦法,來研究下配置項,看看怎麼把不必要的內容不變異進來。所以了解了下各個命令的意思。
2、各個命令:
(1)首先,每個單獨的配置項之間是隔了一個空格的,這是一個需要注意的問題,怕手一抖,把兩條命令貼在了一起,比如
--disable-ffmpeg --disable-ffplay 寫成了--disable-ffmpeg--disable-ffplay
然後編譯的時候,報錯說不識別--disable-ffmpeg--disable-ffplay,你還以為自己這兩條命令打錯了,其實系統是把它看成了一條命令。(2)--prefix=後面跟的是編譯成功後靜態庫存放的路徑,可以自己新建一個文件夾,拖進來就可以了。
(3)然後是一連串--disable-xxx或--enable-xxx這種格式的東西,就是這些影響了編譯後庫裡面的東西,disable是不編譯xxx,anable是編譯xxx。不過這裡有個要注意的,比如解碼方式你只需要h264,不想把其他東西解碼方式編譯進來怎麼辦,使用:
--disable-decoders 和 --enable-decoder=h264結合。前面一句其實是禁用了所有的解碼方式,然後你再編譯某一種解碼方式,這樣就只有這一種解碼方式編譯進來,這樣可以大大的縮小靜態庫而又可以滿足使用需要。而至於有哪些解碼方式,可以使用
./configure --list-decoders來查看。./configure --help可以查看其他很多可執行命令。
Help options: --help print this message --list-decoders show all available decoders --list-encoders show all available encoders --list-hwaccels show all available hardware accelerators --list-demuxers show all available demuxers --list-muxers show all available muxers --list-parsers show all available parsers --list-protocols show all available protocols --list-bsfs show all available bitstream filters --list-indevs show all available input devices --list-outdevs show all available output devices --list-filters show all available filters至於該禁用那些,該啟用哪些,從而達到最優的編譯,額,這可能還需要對ffmpeg的各個組件以及它們在音視頻處理過程中的作用比較了解了才行,能力有限,仍在探索中。
(4)--enable-cross-compile是允許交叉編譯,--target-os=darwin是指定目標操作系統為蘋果系統內核(darwin)。
(5)--sysroot=後面跟的是編譯對應的iOS SDK的路徑,ffmpeg真機和模擬器的編譯是不同的,這裡路徑也相應的不同。這裡的“
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk
”是模擬器的路徑。(6)--cc=後面是編譯器的路徑,Xcode5之後默認編譯改為clang了,使用gcc好像也可以。
(7)--arch=i386 --cpu=i386是選擇系統的結構和cpu類型,模擬器都是i386,iphone3GS以上為:--arch=arm --cpu=cortex-a8,iphone5s為--arch=arm --cpu=cortex-a9。
(8)這裡沒寫的,還有一個命令:--disable-static,使用了之後,編譯出來的是動態庫,不過蘋果貌似不允許使用動態庫,沒去深究,有需要的朋友可以去研究下動態庫的ffmpeg。
編譯過程出問題,可以去ffmpeg的目錄下查看config.log文件,打開可以查看關於錯誤的更詳細信息。
3、使用:
編譯成功後,會有兩個文件夾:include和lib,一個頭文件、一個庫。把它們添加進項目裡面,然後需要配置Header SearchPaths和Library Search Paths,也就是頭文件和庫的路徑,否則會報錯提示“xxx/xxx.h”文件未找到。然後配置好了,還是提示某些文件缺失,可能一是需要添加某些系統動態庫或者框架,而是可能在編譯的時候disable了某些組件。需要了解了項目的需求後,把相應的庫編譯進來。