国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
iOS: FFMpeg編譯和使用問題總結(jié)

iOS: FFmpeg編譯和使用問題總結(jié)

  

  折磨了我近一周多時間的FFmpeg庫編譯問題終于解決了,必須得把這一段時間來遇到過的坑全寫出來。如果急著解決問題,編譯最新版本的FFmpeg庫請直接看第二部分,編譯較老版本(0.7)的FFmpeg庫請直接跳至第七部分,那里有你想要的編譯腳本,但別忘了抽空看看全文。

 

一、背景

  網(wǎng)上有很多FFmpeg編譯配置的資料,大部分都是關(guān)于FFmpeg最新的版本(2.0)的,我一開始也想著編寫一個2.0版本的,可以放到接手的那個項目中,發(fā)現(xiàn)各種問題(無法快進,沒有聲音),再看一下代碼一堆警告,原因很簡單,使用的FFMpeg庫太新了,很多接口變動了。由于手上沒有多少信息,不知道那個項目使用的是哪個版本的FFmpeg庫,一點點找,終于知道原來使用的是0.7.x的。找到目標(biāo)版本的FFmpeg本以為萬事大吉了,后來才發(fā)現(xiàn)原來這才是坑的開始,有歷經(jīng)一系列磨難,最后終于把編譯問題解決了。

  

二、FFmpeg最新版本的庫編譯

  FFmpeg最新版本的應(yīng)該是2.1的,歷史版本詳見http://www.ffmpeg.org/releases/,在這個網(wǎng)站上我們可以下到所有歷史版本的庫。FFmpeg是一個跨平臺的用C語言寫成的庫,包含了編碼,解碼,色彩空間轉(zhuǎn)換等庫。編譯需要用到命令行,對于我們這些沒搞過后臺或者linux開發(fā)的腳本知識欠缺的人來說的確算是一個挑戰(zhàn)。慶幸的是現(xiàn)在網(wǎng)絡(luò)這么方便,不會做問Google,很快就找到了一個在xcode5下一鍵編譯FFmpeg庫的腳本。這個腳本是個老外寫的,真心強大,從下載到編譯到構(gòu)建最后的Fat庫一氣呵成。

  腳本地址: https://gist.github.com/m1entus/6983547

  運行這個腳本需要依賴一個庫Perl寫的腳本,搜了一下網(wǎng)上目前編譯FFmpeg庫的帖子基本都會提到這個腳本,腳本地址如下: https://github.com/mansr/gas-preprocessor。

  下載完這兩個腳本后,編譯FFmpeg庫的準(zhǔn)備工作就基本完成了,接著依次執(zhí)行下面幾步:

  1、拷貝gas-preprocessor.pl文件到 /usr/bin目錄下。

  2、修改gas-preprocessor.pl文件的權(quán)限

  注:需要有讀,寫和執(zhí)行的權(quán)限。具體操作為,首先在命令行下進入/usr/bin目錄,然后執(zhí)行chmod命令,如下圖所示:

  3、切換build-ffmpeg.sh腳本的目錄下,使用命令sh build-ffmpeg.sh 運行該腳本即可。

 

  注:  1) build-ffmpeg.sh腳本的父目錄的名字不能包括空格,否則可能導(dǎo)致構(gòu)建失敗。

      2) build-ffmpeg.sh腳本中可以配置編譯的FFMpeg版本,以及使用iOS SDK的版本,如下圖所示:

 


  該腳本中默認采用的FFmpeg是2.0版本,使用iOS 7.0的SDK編譯,c語言編譯器采用clang,應(yīng)用中可以根據(jù)實際項目需要選中不同的FFmpeg和iOS SDK版本。

  根據(jù)上面的步驟看來,編譯工作也沒有什么復(fù)雜的,為什么我會說踩了很多坑呢?這個問題我會一點點兒解釋。

 

三、編譯較早期版本的FFmpeg本庫

  第二部分中我們介紹了一個牛逼的腳本,一鍵編譯,這給我們造成了一種錯覺,F(xiàn)Fmpeg編譯不過如此嗎!如果我們嘗試一下把腳本中的VERSION變成0.7試試,運行腳本,發(fā)現(xiàn)編譯報錯。如下圖所示:

  提示位置選項--disable-iconv,根據(jù)提示我們輸入./configure查看所有可用選項。命令行下切換到實際的FFmpeg源碼目錄下,查看幫助如下圖:


  我們可以看到很多選項,英語不難,就是有些選項描述的太簡潔了,所以實際使用時如果不確定的話,我們可以去問問google。

  好了回過頭來看看這個configure文件到底有什么作用呢?

  1、裁剪

  我們知道FFmpeg庫是一個非常龐大的庫,包括編碼,解碼以及流媒體的支持等,如果不做裁剪全部編譯進來的話,最后生成的靜態(tài)庫會很大。實際使用中我們可能只想用到解碼(例如播放器),因此我們可以使用相關(guān)選項指定編譯時禁用編碼部分。當(dāng)然我們還可以做進一步的裁剪,例如只打開部分常用格式的解碼,禁用掉其他的解碼,這樣編譯出來的靜態(tài)庫將會更小。

  要想裁剪,我們的先知道有哪些部分,使用下面的命令可以查看FFMpeg庫支持的組件列表。

1
2
3
4
5
6
7
8
9
10
11
--list-decoders          show all available decoders
--list-encoders          show all available encoders
--list-hwaccels          show all available hardware accelerators
--list-muxers            show all available muxers
--list-demuxers          show all available demuxers
--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

  我們可以根據(jù)實際需要把不用的部分都禁用掉,這樣編譯快,包也會比較小,常用的裁剪選項如下:

1
2
3
4
5
6
7
8
9
10
11
12
--disable-doc            do not build documentation
--disable-ffmpeg         disable ffmpeg build
--disable-ffplay         disable ffplay build
--disable-ffserver       disable ffserver build
--disable-network        disable network support [no]
--disable-encoder=NAME   disable encoder NAME
--enable-encoder=NAME    enable encoder NAME
--disable-encoders       disable all encoders
--disable-decoder=NAME   disable decoder NAME
--enable-decoder=NAME    enable decoder NAME
--disable-decoders       disable all decoders
--disable-hwaccel=NAME   disable hwaccel

  舉個例子,如果我們需要做一款本地視頻播放器,那么我們可以使用如下配置:

  

  當(dāng)然你還可以根據(jù)幫助列表進行更細粒度的裁剪,例如只支持哪幾種格式的解碼等等。

 

  2、指定編譯環(huán)境

  FFMpeg作為一個跨平臺的庫,不同的平臺,不同的人的計算機上編譯器的路徑都可能不盡相同,所以我們需要為編譯腳本指定編譯器的路徑。同事我們還可以指定其他編譯選項,如是否交叉編譯,目標(biāo)平臺系統(tǒng),CPU架構(gòu),需要依賴的其他庫的路徑已經(jīng)指定是否禁用匯編優(yōu)化等。

1
2
3
4
5
6
7
8
9
10
11
--enable-cross-compile   assume a cross-compiler is used
--sysroot=PATH           root of cross-build tree
--sysinclude=PATH        location of cross-build system headers
--target-os=OS           compiler targets OS []
--cc=CC                  use C compiler CC [gcc]
--extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS []
--extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS []
--arch=ARCH              select architecture []
--cpu=CPU                select the minimum required CPU (affects
                         instruction selection, may crash on older CPUs)
--disable-asm            disable all assembler optimizations

  sysroot即iOS SDK的路徑,注意編譯真機版本的庫時需要使用iPhoneOS.platform中SDK的路徑,編譯模擬器版本的庫使用iPhoneSimulator.platform中SDK的路徑。target-os填寫darwin(蘋果系統(tǒng)的內(nèi)核),arch可以根據(jù)具體的情況添加i386(模擬器),armv6,armv7等。cpu根據(jù)具體類型可填寫cortex-a8,cortox-a9,i386等。   

 

  3、指定靜態(tài)庫的安裝路徑

  指定執(zhí)行make install命令時編譯好的靜態(tài)庫和相關(guān)頭文件拷貝到的位置,即FFmpeg庫編譯后輸出的路徑。通常我們只需要設(shè)置“--prefix=PREFIX”選項即可。例如我們需要將最后生成靜態(tài)庫的路徑指向“build/armv7”下,則設(shè)置--prefix="build/armv7";

   

四、FFmpeg0.7版本庫一鍵編譯腳本

  通過第三部分的介紹,相信我們應(yīng)該對FFmpeg的配置都有了一個初步的認識,我們再回到第三部分開始時我們運行build-ffmpeg.sh的碰到的問題,經(jīng)過查看configure的幫助,我們發(fā)現(xiàn)0.7這個版本的FFmpeg庫卻是沒有"--disable-iconv"選項。這個牛逼的腳本是針對當(dāng)前較新的FFmpeg庫寫的,在低版本中沒有一些配置選項也是正常。

  下面給出經(jīng)過修改后的腳本,腳本中對原先的腳本進行了精簡,去掉了下載部分的代碼。

build-ffmpeg0.7

  注:由于FFmpeg庫比較陳舊,該腳本使用xcode4.6下,編譯器為GCC,采用6.1的SDK進行編譯。如果你的機器上裝的同事安裝了xcode4.x和xcode5的話,可以在命令行下使用如下命令切換當(dāng)前的默認編譯環(huán)境為xcode4.6即可:

  設(shè)置好xcode的編譯環(huán)境以后,只需要將該腳本拷貝到FFMpeg源文件路徑下運行即可一鍵生成armv7,armv7s,i386以及合成后的全平臺庫。

 

五、如何使用以及編譯鏈接中可能遇到的問題

  第四部分中我們對build-ffmpeg.sh的腳本進行了修改和精簡后得到了build-ffmpeg0.7.sh,我們只需要運行該腳本就可以一鍵完成FFmpeg 0.7版本庫的編譯工作了。編譯后我們得到的是lib目錄(包含所有生成的靜態(tài)庫)以及include目錄(包含相應(yīng)的頭文件),使用時我們只需要將這些文件添加到工程中即可。

  問題到這里似乎就全部解決了,如果順利的話,恭喜你,你可以直接使用了。

  如果你跟我一樣的"不幸"的話,可能還會遇到一些其他問題。下面是我遇到的問題及解決辦法:

  1、time.h重復(fù)問題

  我們知道一般靜態(tài)庫都是搭配頭文件使用的,要在項目里面使用FFmpeg庫,我們出了需要在xcode的build phases中添加靜態(tài)庫以外,還需要導(dǎo)入該庫對應(yīng)的頭文件。FFmpeg庫對應(yīng)的頭文件有很多,通常會采用設(shè)置header search path的方式來導(dǎo)入頭文件,這樣做有兩個好處: 第一可以避免對我們的工程結(jié)構(gòu)造成干擾。第二可以在一定程序上降低頭文件沖突。

  time.h沖突的問題就是屬于頭文件沖突,系統(tǒng)的標(biāo)準(zhǔn)庫中有time.h文件,F(xiàn)Fmpeg應(yīng)該是在1.1之后也加入了一個time.h文件,路徑為libavutil/time.h。所以如果你使用的是FFmpeg1.1之后的版本,那么在使用中就可能會碰到頭文件沖突的問題。解決這個問題,網(wǎng)上流傳一個方法是修改FFmpeg庫中time.h文件的名字,我覺得這太麻煩了,而且也容易出錯。后來查看FFmpeg源碼的時候偶然發(fā)現(xiàn)它自身內(nèi)部引用這個time.h的時候都有帶一層父目錄,如#include "libavutil/time.h"。因此想是不是通過指定頭文件搜索路徑就可以解決這個問題。

  打開工程設(shè)置頁面,搜索header search path如下圖所示:

  如果你的FFmpeg庫正好是放在當(dāng)前的路徑下,且為了偷懶設(shè)置了遞歸包含頭文件的話,那么你很可能就會遇到time.h沖突的問題。因為xcode工程默認的設(shè)置是優(yōu)先查找用戶路徑,編譯時FFmpeg中l(wèi)ibavutil下的time.h就會優(yōu)先被鏈接,從而導(dǎo)致不會再鏈接系統(tǒng)time.h文件,最終導(dǎo)致編譯失敗。

  解決這個問題有兩個辦法:

  a、取消掉Header Search Paths中的遞歸引用。

  b、設(shè)置Always Search User Paths為NO。

 

  2、gcc c compiletest error問題
  xcode5下面編譯FFmpeg都采用clang,同樣也會遇到類似問題。這個問題通常出現(xiàn)在配置文件錯誤的情況下,一般都是gcc路徑錯誤,當(dāng)然也可能是其他編譯參數(shù)錯誤問題。

  出現(xiàn)這個問題我們應(yīng)該首先檢查gcc的路徑是否正確,如果確認了指定路徑上存在gcc程序,但是還是報錯的,我們再去檢查當(dāng)前要編譯的平臺和指定的gcc路徑是否一致,如果你使用iPhoneOS.platform下面的gcc去編譯i386平臺的庫那肯定是不會測試通過的。

 

  3、C compiler test failed問題
  編譯i386版本的FFmpeg庫和armv版本庫可能用到的參數(shù)不盡相同,例如我遇到這個問題,我的編譯選項中有一項如下:

  --extra-cflags='-arch i386 -mfloat-abi=softfp -miphoneos-version-min=5.0'

  在我確認其他參數(shù)(如cpu,arch)都正確的情況下,依然提示我們“C compiler test failed.” 后面緊跟著一句查看config.log你可以得到更詳細的信息,于是打開該文件,你可以在最開始的地方看到你的配置語句,如果是用腳本,這塊兒會顯示最終解釋后(替換參數(shù)為真實值)的配置語句。然后緊跟著一堆具體的配置,通??尢涞腻e誤信息會在該文件的最末尾。我遇到的問題的信息如下:

  

  看到標(biāo)紅的這個區(qū)域了沒有,提示“-mfloat-abi=softfp”選項不支持,刪掉該選項后,在運行時配置就通過了。其他配置問題,都可以通過查看config.log來獲取更詳細的錯誤信息。

 

  4、由于未導(dǎo)入libbz動態(tài)庫的問題

  如果導(dǎo)入FFmpeg庫了,并且配置了頭文件搜索路徑,遇到"Undefined symbols for architecture armv7s: _BZ2_bzDecompressInit",如下圖所示:

 

  這個問題是由于沒有導(dǎo)入“l(fā)ibbz2.dylib”庫的原因,導(dǎo)入庫即可解決該問題。

 

  5、libavcodec/audioconvert.h頭文件缺失問題

  不知道為什么執(zhí)行make install的時候libavcodec中的audioconvert.h怎么沒有拷貝到include目錄下的libavcodec中去,查看發(fā)現(xiàn)原來libavutil目錄下已經(jīng)有一個audioconvert.h了。解決這個問題只需要從FFmpeg庫的libavcodec中拷貝audioconvert.h頭文件到include的libavcodec目錄中即可解決。

 

六、雜談

  感謝我所遭遇的"不幸",如果當(dāng)時接受的項目使用的最新版本的FFmpeg庫,我可能就直接運行一下那個牛逼的腳本,然后一切就可以順順利利。如果真是那樣的話,我可能也就不會花時間去學(xué)習(xí)基本的腳本知識,去了解FFmpeg庫的相關(guān)配置,這樣的結(jié)果就是下次當(dāng)我中獎遇到FFmpeg庫編譯鏈接等問題時,只能束手無策。

  說了這么多,當(dāng)我們使用一個技術(shù)的時候,不應(yīng)該僅僅停留在會用的層次,花點兒時間了解一下背后的原理會更讓你對該技術(shù)有個更深的理解,多學(xué),多看,多思考,最終會有有所收獲的。

 

七、編譯腳本及參考資料

  1、編譯腳本  

  gas-preprocessor腳本地址: https://github.com/mansr/gas-preprocessor  

  FFmpeg 2.x一鍵化編譯腳本https://gist.github.com/m1entus/6983547

  FFmpeg0.7一鍵化編譯腳本: https://gist.github.com/smileEvday/7565260

 

  2、參考資料

  模擬器與真機下ffmpeg的編譯方法(總結(jié)版)

  http://www.cocoachina.com/iphonedev/toolthain/2011/1020/3395.html

  編譯在ios4.3中使用的ffmpeg庫(轉(zhuǎn))

  http://www.cocoachina.com/bbs/simple/?t70887.html

  Installing ffmpeg ios libraries armv7, armv7s, i386 and universal on Mac with 10.8 

  http://stackoverflow.com/questions/18003034/installing-ffmpeg-ios-libraries-armv7-armv7s-i386-and-universal-on-mac-with-10/19370679#19370679

 

注:如果覺得本文幫到了你,別忘了點推薦

  轉(zhuǎn)載請著名出處,有什么問題歡迎留言

  歡迎一起討論iOS開發(fā)的知識?。?!

 

 

 

 

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Xcode 之自己編譯靜態(tài)庫
Xcode打包踩過的那些坑
IJKFFMoviePlayer 直播
iOS使用Workspace來管理多項目
ijkplayer編譯so庫真沒那么難
IOS中創(chuàng)建使用鏈接庫(總結(jié))
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服