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


iOS: FFMpeg編譯和使用問題總結

iOS: FFmpeg編譯和使用問題總結

  

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

 

一、背景

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

  

二、FFmpeg最新版本的庫編譯

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

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

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

  下載完這兩個腳本后,編譯FFmpeg庫的准備工作就基本完成了,接着依次執行下面幾步:

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

  2、修改gas-preprocessor.pl文件的權限

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

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

 

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

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

 

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

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

 

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

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

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

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

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

  1、裁剪 

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

  要想裁剪,我們的先知道有哪些部分,使用下面的命令可以查看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

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

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 

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

  

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

 

  2、指定編譯環境

  FFMpeg作為一個跨平台的庫,不同的平台,不同的人的計算機上編譯器的路徑都可能不盡相同,所以我們需要為編譯腳本指定編譯器的路徑。同事我們還可以指定其他編譯選項,如是否交叉編譯,目標平台系統,CPU架構,需要依賴的其他庫的路徑已經指定是否禁用匯編優化等。

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(蘋果系統的內核),arch可以根據具體的情況添加i386(模擬器),armv6,armv7等。cpu根據具體類型可填寫cortex-a8,cortox-a9,i386等。   

 

  3、指定靜態庫的安裝路徑

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

   

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

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

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

 1 #!/bin/sh
 2 
 3 ########################################################################
 4 ##################### copyright by smileEvday ##########################
 5 ##################### smileEvday.cnblogs.com ###########################
 6 ########################################################################
 7 
 8 # FFMpeg,SDK版本號
 9 VERSION="0.7.4"
10 SDKVERSION="6.1"
11 
12 #最低支持的SDK版本號
13 MINSDKVERSION="5.0"
14 
15 # 源文件路徑
16 SRCDIR=$(pwd)
17 BUILDDIR="${SRCDIR}/build"
18 mkdir -p $BUILDDIR
19 
20 # 獲取xcode開發環境安裝路徑
21 DEVELOPER=`xcode-select -print-path`
22 
23 # 要編譯的架構列表
24 ARCHS="armv7 armv7s i386"
25 for ARCH in ${ARCHS}
26 do
27     if [ "${ARCH}" == "i386" ];
28     then
29         PLATFORM="iPhoneSimulator"
30         EXTRA_CFLAGS="-arch i386"
31         EXTRA_LDFLAGS="-arch i386 -mfpu=neon"
32         EXTRA_CONFIG="--arch=i386 --cpu=i386"
33     else
34         PLATFORM="iPhoneOS"
35         EXTRA_CFLAGS="-arch ${ARCH} -mfloat-abi=softfp"
36         EXTRA_LDFLAGS="-arch ${ARCH} -mfpu=neon -mfloat-abi=softfp"
37         EXTRA_CONFIG="--arch=arm --cpu=cortex-a9 --disable-armv5te"
38     fi
39     
40     make clean
41 
42     # you can do any clip here 
43     ./configure --prefix="${BUILDDIR}/${ARCH}"         \
44                 --disable-doc                         \
45                 --disable-ffmpeg                     \
46                 --disable-ffplay                     \
47                 --disable-ffserver                     \
48                 --enable-cross-compile                 \
49                 --enable-pic                         \
50                 --disable-asm                        \
51                 --target-os=darwin                     \
52                 ${EXTRA_CONFIG}                        \
53                 --cc="${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/usr/bin/gcc"                                         \
54                 --as="/usr/bin/gas-preprocessor.pl"                                                                                \
55                 --sysroot="${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk"                 \
56                 --extra-cflags="-miphoneos-version-min=${MINSDKVERSION} ${EXTRA_CFLAGS}"                                                        \
57                 --extra-ldflags="-miphoneos-version-min=${MINSDKVERSION} ${EXTRA_LDFLAGS} -isysroot ${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk"
58 
59     make && make install && make clean
60      
61 done
62 
63 ########################################################################################################################
64 ##################################################### 生成fat庫 #########################################################
65 ########################################################################################################################
66 mkdir -p ${BUILDDIR}/universal/lib
67 cd ${BUILDDIR}/armv7/lib
68 
69 for file in *.a
70 do
71 
72 cd ${SRCDIR}/build
73 xcrun -sdk iphoneos lipo -output universal/lib/$file  -create -arch armv7 armv7/lib/$file -arch armv7s armv7s/lib/$file -arch i386 i386/lib/$file
74 echo "Universal $file created."
75 
76 done
77 cp -r ${BUILDDIR}/armv7/include ${BUILDDIR}/universal/
78 
79 echo "Done."
80 
81 build-ffmpeg0.7
build-ffmpeg0.7

 

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

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

 

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

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

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

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

  1、time.h重復問題

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

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

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

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

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

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

  b、設置Always Search User Paths為NO。

 

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

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

 

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

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

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

  

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

 

  4、由於未導入libbz動態庫的問題

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

 

  這個問題是由於沒有導入“libbz2.dylib”庫的原因,導入庫即可解決該問題。

 

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

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

 

六、雜談

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

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

 

七、編譯腳本及參考資料

  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的編譯方法(總結版)

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

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

  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

 

 

 

分類:  iOS
綠色通道:  好文要頂  關注我  收藏該文 與我聯系 
6
0
 
(請您對文章做出評價)
 
« 上一篇: iOS7: 如何獲取不變的UDID
» 下一篇: 這半年我為什么沒有更新博客

posted on 2013-11-21 00:05 一片-楓葉 閱讀(10487) 評論(44)  編輯 收藏

 

評論

#1樓 2013-11-21 11:47 dreamhappy  

 

我在windows服務器上 使用ffmpeg.exe 格式轉換視頻過程中 cpu總是飆到95% 以上,不知道你可有什么解決方法?
  

 

#2樓[樓主] 2013-11-21 14:57 一片-楓葉  

 

@dreamhappy
windows上的還沒搞過,這個問題還真沒法回答你
  

 

#3樓 2013-12-11 14:39 三毛大哥80  

 

按照那個什么自動腳本,我這報的錯誤:
macmatoMac-Pro:Downloads mac$ sh build-ffmpeg.sh 
: command not foundne 2: 
: command not foundne 15: 
: command not foundne 19: 
: command not foundne 21: 
: No such file or directoryd: .
: command not foundne 24: 
: command not foundne 30: 
: command not foundne 31: 
: command not foundne 34: 
: command not foundne 41: 
: command not foundne 43: 
: command not foundne 45: 
: invalid option line 47: set: -
set: usage: set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
  

 

#4樓 2013-12-11 14:52 三毛大哥80  

 

第2,15,19都沒有腳本,是注釋或者空行,不知道他錯誤是怎么報出來的
  

 

#5樓[樓主] 2013-12-11 19:48 一片-楓葉  

 

@三毛大哥80
你用的是 https://gist.github.com/m1entus/6983547 這個腳本吧
  

 

#6樓 2013-12-12 10:26 三毛大哥80  

 

是的,用的這個腳本
  

 

#7樓[樓主] 2013-12-13 15:12 一片-楓葉  

 

@三毛大哥80
這個腳本我試了,沒有問題的,你看看是不是有非法字符在里面,下載下來有編輯過嗎?
  

 

#8樓 2014-01-02 23:51 龍象般若  

 

根據博主的教程,我第一步執行完后怎么木有看見.a文件呢
  

 

#9樓[樓主] 2014-01-07 09:33 一片-楓葉  

 

@龍象般若
具體一點,報什么錯?
  

 

#10樓 2014-01-07 15:40 吳春藝  

 

--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 
這幾個都是干什么用的啊?
  

 

#11樓 2014-01-07 15:41 吳春藝  

 

我想都禁掉,但是用ffmpeg.c得時候會報錯,如果不禁掉靜態庫文件又太大。。做編解碼可以禁掉哪些東西啊?
  

 

#12樓 2014-01-07 16:20 飄盪的雲  

 

樓主,您好,我在執行這個腳本的時候 第一項怎么是去下載呢 
Downloading ffmpeg-2.0.2.tar.bz2
我是將腳本放到我下載的最新版本的ffmpeg中了 但為什么還是去下載呢,為什么不下載最新版本的2.1呢,謝謝了
  

 

#13樓 2014-01-07 16:29 飄盪的雲  

 

不好意思樓主 還得再請教一下 這個編譯出來的能兼容arm64的嗎,還有能不能修改一下腳本,去掉支持模擬器的編譯呢,這樣庫是不是就小點了呢 謝謝了
  

 

#14樓 2014-01-07 16:50 飄盪的雲  

 

第一個問題 已經解決了 怪我沒有仔細看代碼 就冒昧的問問題了 不好意思 樓主
  

 

#15樓[樓主] 2014-01-07 19:43 一片-楓葉  

 

@飄盪的雲
arm64可以兼容的,向下兼容而已,就像ios 7的系統可以跑6的sdk編寫的程序一樣。
可以修改腳本去掉模擬器支持,庫是會小一點兒。不過根據實際經驗在你編譯成最終ipa上傳的時候一般都會只支持真機,這個庫也會根據需要鏈接的,不會影響最終ipa的大小
  

 

#16樓[樓主] 2014-01-07 19:45 一片-楓葉  

 

@吳春藝
引用--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 ...


這幾個跟list-decoders一樣就是顯示支持的合成器列表,根據實際需要禁掉就好了,具體的要看情況
  

 

#17樓 2014-01-08 09:51 飄盪的雲  

 

群主你好,我在arm64位的機器上測試了一下,沒法運行,直接報錯的
ld: warning: ld: warning: ignoring file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavfilter.a, missing required architecture arm64 in file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavfilter.a (3 slices)ignoring file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libswresample.a, missing required architecture arm64 in file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libswresample.a (3 slices)

ld: warning: ignoring file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavformat.a, missing required architecture arm64 in file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavformat.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavdevice.a, missing required architecture arm64 in file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavdevice.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavresample.a, missing required architecture arm64 in file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavresample.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavutil.a, missing required architecture arm64 in file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavutil.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavcodec.a, missing required architecture arm64 in file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libavcodec.a (3 slices)
ld: warning: ignoring file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libswscale.a, missing required architecture arm64 in file /Users/user/Desktop/公司資料/code/高清攝像頭/PlayerUseImage/PlayerUseImage/libs/libswscale.a (3 slices)
Undefined symbols for architecture arm64:
"_av_init_packet", referenced from:
-[VideoDecoder decodeWithData:] in VideoDecoder.o
"_avcodec_alloc_frame", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_sws_scale", referenced from:
-[VideoDecoder decodeWithData:] in VideoDecoder.o
"_avcodec_alloc_context3", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_av_free_packet", referenced from:
-[VideoDecoder decodeWithData:] in VideoDecoder.o
"_avcodec_open2", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_avpicture_alloc", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_av_register_all", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_avcodec_find_decoder", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_avpicture_free", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_sws_freeContext", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_avcodec_decode_video2", referenced from:
-[VideoDecoder decodeWithData:] in VideoDecoder.o
"_avcodec_register_all", referenced from:
-[VideoDecoder init] in VideoDecoder.o
"_sws_getContext", referenced from:
-[VideoDecoder init] in VideoDecoder.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果我把arm64位去掉的話,錯誤和警告就沒了,但是我覺得這不是長久之計,所以我覺得還是現在解決一下比較好,我在網上找到了一個編譯ffmpeg arm64的,不是很懂,樓主可否將這兩個綜合一下呢,將arm64的編譯挪到你現在的腳本中,網址如下: https://github.com/kewlbear/FFmpeg-iOS-build-script
謝謝了
  

 

#18樓[樓主] 2014-01-08 13:00 一片-楓葉  

 

@飄盪的雲
你編譯的是0.7版本的還是2.0?
  

 

#19樓 2014-01-08 13:09 飄盪的雲  

 

@一片-楓葉
您好,樓主,是2.1的,我之前用的1.2也是這個問題,所以我換成2.1的試試,也是一樣的問題哈
  

 

#20樓 2014-01-08 13:17 飄盪的雲  

 

@一片-楓葉
2.1有問題,不如之前的1.2版本問題,之前的1.2如果我穿進去的數據不是一幀的話,不會崩潰的,2.1的會崩潰,之前每秒10幀,一點問題沒有,用了2.1的話,也會崩潰,提示
[h264 @ 0x1d98ec00] corrupted macroblock 24 4 (total_coeff=-1)
[h264 @ 0x1d98ec00] error while decoding MB 24 4
[h264 @ 0x1d98ec00] concealing 3305 DC, 3305 AC, 3305 MV errors in I frame
[h264 @ 0x1d98ec00] no frame!
這種錯誤,貌似因為我傳進的速度,大於他的解碼速度了,導致出現這個問題的,不知道為何們2.1的解碼速度這么慢呢 樓主能加我qq嗎(532917100)謝謝了
  

 

#21樓[樓主] 2014-01-08 14:18 一片-楓葉  

 

@飄盪的雲
具體的解碼我也不懂,要支持arm64的話,直接在腳本最開始的地方armv7,armv7s 后面加上arm64應該就可以了
  

 

#22樓 2014-01-08 14:25 飄盪的雲  

 

@一片-楓葉
這個我試了哈 樓主 把i386改成arm64位了,但是最后沒有生成啊 看來還是需要改一些東西的啊
  

 

#23樓[樓主] 2014-01-09 08:59 一片-楓葉  

 

@飄盪的雲
我今天抽空看看,改好了qq通知你
  

 

#24樓 2014-01-09 09:06 飄盪的雲  

 

@一片-楓葉
恩恩,謝謝你,樓主
  

 

#25樓 2014-02-13 10:42 碼農張三豐  

 

樓主 我的報這個錯是怎么回事
Building without ccache
./configure: line 2870: /Users/zhangyu/Xcode5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang: No such file or directory
./configure: line 2870: /Users/zhangyu/Xcode5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang: No such file or directory
/Users/zhangyu/Xcode5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang is unable to create an executable file.
C compiler test failed.
  

 

#26樓[樓主] 2014-02-13 15:40 一片-楓葉  

 

@碼農張三豐
路徑錯誤
/Users/zhangyu/Xcode5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
找不到Clang,你看看這個路徑下有嗎?
  

 

#27樓 2014-02-13 15:44 碼農張三豐  

 

@一片-楓葉
我的Xcode是Xcode5版本的 但是名字是Xcode這樣有問題嗎?
如果是Xcode下面是有這個路徑的啊
  

 

#28樓[樓主] 2014-02-14 12:35 一片-楓葉  

 

那你就把/Users/zhangyu/Xcode5.app/ --》/Users/zhangyu/Xcode.app/
  

 

#29樓 2014-03-24 09:03 vale_1988  

 

謝謝樓主經驗分享,我在運行腳本時遇到這個錯誤:
Using ffmpeg-2.1.4.tar.bz2
Building without ccache
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang is unable to create an executable file.
C compiler test failed.

請問是啥問題引起的?我的環境是 Mac OX 10.9,Xcode5.1
------------------------------------------------------------
把腳本里的路徑一個個打印下來,發現原來是Xcode5.1中裝的是iOS7.1的SDK,而不是iOS7.0的SDK。謝謝。
-------------------------------------------------------
還是有問題 后加入 " --disable-armv6 \
--disable-armv6t2 \" 這兩個參數就好了。
再次感謝。
  

 

#30樓 2014-04-21 18:23 lzh01  

 

armv7
armv7s
i386
universal

博主,這是我生成的文件,我是不是需要合成一個啊?我怎么合成?
  

 

#31樓 2014-04-21 19:27 lzh01  

 

集合到iFrameExtractor 怎么都沒有畫質的,就一片默認顏色!log提示
[swscaler @ 0xd0fb600] No accelerated colorspace conversion found from yuv420p to rgb24.
不知道大家有沒有遇到這樣的問題!
我使用編譯后的庫是universal
  

 

#32樓[樓主] 2014-04-22 11:12 一片-楓葉  

 

@lzh01
universal里面的就是合成好的庫
  

 

#33樓 2014-04-24 14:43 lzh01  

 

@一片-楓葉
謝謝博主!
還有一個問題,按照 http://www.cnblogs.com/ikodota/archive/2012/09/12/compile_ffmpeg_for_iOS.html
的教程,編譯總報
Configure options: --disable-asm --enable-cross-compile --enable-gpl --enable-postproc --enable-swscale --enable-avfilter
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc is unable to create an executable file.
C compiler test failed.
錯誤!不知博主是否也遇到過!
  

 

#34樓[樓主] 2014-04-24 18:31 一片-楓葉  

 

@lzh01
參數不對,或者版本不對應,之前我遇到過只有畫面沒有聲音的問題
  

 

#35樓 2014-04-25 16:53 lzh01  

 

@一片-楓葉
我發現我編譯都沒通過!錯誤都是
Configure options: --disable-asm --enable-cross-compile --enable-gpl --enable-postproc --enable-swscale --enable-avfilter
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc is unable to create an executable file.
C compiler test failed.
  

 

#36樓 2014-05-07 11:55 騎驢追火箭  

 

@一片-楓葉
出現這個問題是什么原因啊
liangyingjundeMacBook-Pro:ffmpeg-2.0.2 Onery$ xcode -s /Applications/Xcode5.1.app/Contents/Developer

-bash: xcode: command not found
  

 

#37樓 2014-09-11 17:58 遇則安  

 

博主,感謝分享。
看完這篇博客后深受啟發,但按照文中步驟編譯時總是有問題。iOS sdk:7.1,ffmpeg:2.3.3,Xcode 5.1.1,每次都是gas-preprocessor報錯,剛開始說找不到這個文件,然后將build-ffmpeg.sh腳本中的gas-preprocessor路徑改為/usr/bin/gas-preprocessor,然后顯示gas-preprocessor的第88行報錯。對應的文件都是在博文中的鏈接下載的,報錯信息在ffmpeg/config.log中看的。然后看到一些博客中說Xcode5以上不在需要gas-preprocessor文件了,於是把build-ffmpeg.sh腳本中關於gas-preprocessor的“--as='/usr/local/bin/gas-preprocessor.pl'”刪掉后,終於編譯成功了。不知道在使用過程中還會遇到什么問題。
  

 

#38樓 2014-11-21 15:25 廣州-小a  

 

樓主!你好!
我現在將ffmpeg編譯好之后,想將自己編寫的sdk.c等其他c源文件(調用到了ffmpeg里面的方法)進一步編譯成一個庫,最后供后續調用,那么現在想進一步編譯庫,應該怎么做?
  

 

#39樓 2014-11-27 09:41 他三叔走啊  

 

大俠 照着你的帖子 編譯成功了 但是導入項目之后 不知道怎么用 能給講講嗎 我要做圖片合成視頻的功能 謝謝了 我QQ490849131
  

 

#40樓[樓主] 2014-11-28 09:23 一片-楓葉  

 

@廣州-小a
新建靜態庫工程,導入你編譯好的ffmpeg的靜態庫,加上你的SDK。c,然后后輸出一個工程
當然ffmpeg的頭文件也是需要輸出的,具體的工程設置google一下
  

 

#41樓[樓主] 2014-11-28 09:23 一片-楓葉  

 

@他三叔走啊
具體點,為什么不能用呢?
  

 

#42樓 2014-11-28 09:34 他三叔走啊  

 

@一片-楓葉
可以用 是我不會用 我要做的功能是 多張圖片合成視頻 能指點一下么? 我QQ490849131 謝謝了
  

 

#43樓 2014-12-02 16:17 他三叔走啊  

 

博主 你好 我想問問 知道怎么在代碼里調用ffmpeg的命令嗎?
  

 

#44樓 2014-12-02 16:24 paschal  

 

@vale_1988
我也是你這錯誤,我改了好多還是不行,求指點

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM