ffmpegios編譯
Ⅰ 如何讓FFmpeg在iOS上完美編譯
一、系統環境 MAC OS X Mountain Lion 10.8.3、 XCode 5.1 二、編譯FFMpeg 1、下載ffmpeg2.2.5版本代碼,並解壓。 2、下載並解壓gas-preprocessor.pl (附件中有,zip格式,因網易博客不能上傳zip後綴的文件,故加了個.rar) 在終端中使用cp命令...
Ⅱ ios ijkplayer怎麼加入自己編譯的ffmpeg
找到問題了編譯的時候首先要連接libx264 ,le-libx264 --enable-gpl --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib 然後要打開這個編碼器--enable-encoder=libx264,我就是這一步搞錯了一直找不到,我在編譯的時候禁掉...
Ⅲ ios下 怎麼在代碼中調用ffmpeg的命令
ffmpeg是一個多平台多媒體處理工具,處理視頻和音頻的功能非常強大。目前在網上搜到的iOS上使用FFMPEG的資料都比較陳舊,而FFMPEG更新迭代比較快; 且網上的講解不夠詳細,對於初次接觸FFMPEG的新手(例如我)來說確實不太好使用。為了防止忘記,這里對iOS下使用FFMPEG做一個總結。
1. FFMPEG層次結構的簡單理解
要使用FFMPEG,首先需要理解FFMPEG的代碼結構。根據志哥的提示,ffmpeg的代碼是包括兩部分的,一部分是library,一部分是tool。api都是在library裡面,如果直接調api來操作視頻的話,就需要寫c或者c++了。另一部分是tool,使用的是命令行,則不需要自己去編碼來實現視頻操作的流程。實際上tool只不過把命令行轉換為api的操作而已。
2. 預熱-在mac os下使用ffmpeg
在mac os下使用ffmpeg比較簡單,可以直接使用命令行來操作。首先安裝ffmpeg,這里默認系統已經安裝好brew,只需要在終端上輸入:
brew install ffmpeg
等待安裝結束即可。
安裝結束後,嘗試以下命令:
ffmpeg -i input.mp4 output.avi
如果能順利轉換,表明安裝成功
3. 編譯能在iOS下使用的FFMPEG library庫
這一步是編譯1所說的library,編譯好之後可以調用FFMPEG的api。網上有一些方法,但都要自己手動編譯,稍顯復雜而且比較陳舊。按照app store的需求,編譯出來的包還必須支持arm64。我在萬能的github中找到一個能夠"一鍵編譯"的腳本,地址如下:
https://github.com/kewlbear/FFmpeg-iOS-build-script
而且寫這個腳本的歪果仁挺好人,更新很及時,已經更新到了最新的2.5.3版本。下載下來,只有一個build-ffmpeg.sh腳本文件。在終端中轉至腳本的目錄,執行命令:
./build-ffmpeg.sh
腳本則會自動從github中把ffmpeg源碼下到本地並開始編譯。
編譯結束後,文件目錄如下:
其中,ffmpeg-2.5.3是源碼,FFmpeg-iOS是編譯出來的庫,裡面有我們需要的.a靜態庫,一共有7個。
執行命令:
lipo -info libavcodec.a
查看.a包支持的架構,這幾個包都支持了armv7 armv7s i386 x86_64 arm64這幾個架構,這個腳本果真是業界良心啊~~~
4.在xcode中引入FFMPEG library庫
新建工程,把上面編譯好的FFmpeg-iOS拖到xcode工程中,添加一個頭文件引用
#include "avformat.h"
添加一個api語句:
av_register_all();
添加一個空的類,把執行文件.m後綴改為.mm,開啟混編模式。
添加相應的framework,包括avfoundation和coremedia。
運行工程,如果沒有報錯,則表明編譯成功。
5.在xcode項目中使用命令行
執行到第4步,已經可以使用library庫了。但是如果要對視頻進行操作,還是需要手動寫很多代碼去調用api,工作量較大,自然不如直接寫命令行方便。為了命令行能夠在xcode工程中使用,還需要做以下工作:
(1)添加源碼中的tools,具體文件包括:
(2)添加Header Search Paths
在target--build setting中搜索Header Search Paths,並在Header Search Paths下面添加源碼ffmpeg-2.5.3和scratch的路徑。
(3)修改ffmpeg.h和ffmpeg.c源碼
如果此時run這個工程,則會報錯,原因是工程裡面有2個main函數,此時處理方法為:
在ffmpeg.h中添加一個函數聲明:
int ffmpeg_main(int argc, char **argv);
在ffmpeg.c中找到main函數,把main函數改為ffmpeg_main。
(4)調用命令行範例
添加頭文件:#import "ffmpeg.h"
調用命令行
int numberOfArgs = 16;
char** arguments = calloc(numberOfArgs, sizeof(char*));
arguments[0] = "ffmpeg";
arguments[1] = "-i";
arguments[2] = inputPath;
arguments[3] = "-ss";
arguments[4] = "0";
arguments[5] = "-t";
arguments[6] = rationChar;
arguments[7] = "-vcodec";
arguments[8] = "";
arguments[9] = "-acodec";
arguments[10] = "aac";
arguments[11] = "-strict";
arguments[12] = "-2";
arguments[13] = "-b:a";
arguments[14] = "32k";
arguments[15] = outputPath;
int result = ffmpeg_main(numberOfArgs, arguments);
其中inputpath和outputpath是文件路徑。經測試,這兩個路徑不支持asset-library://協議和file:// 協議,所以如果是要用相冊的文件,我目前的解決辦法是把它拷貝到沙盒裡面。
6. 改關閉進程為關閉線程
如果順利進行到了第5步,在app中是能夠用命令行處理視頻了,但會出現一個問題,app會退出。經肖大神提醒,發現了命令行執行完畢之後會退出進程。而iOS下只能啟動一個進程,因此必須改關閉進程為關閉線程,或者直接把關閉進程的方法給注掉。
在ffmpeg.c中可以看到,執行退出進程的方法是exit_program,定位到了cmtils.c中執行了c語言的exit方法。這里我將它改為了pthread_exit(需要添加#include 頭文件)。在xcode項目中使用時,則可以用NSThread來新開一個線程,執行完畢之後,把線程關閉了即可。再使用NSThreadWillExitNotification通知,即可監聽線程退出的情況。
7. 修復ffmpeg.c裡面的一個bug
在實際項目中,可能需要多次調用命令行,但在多次調用命令行的過程中,發現ffmpeg.c的代碼中會訪問空屬性導致程序崩潰。逐步debug後發現,很多指針已經置空了,但它們的計數卻沒有置零,不知道是不是ffmpeg.c的一個bug。修復方法如下:在ffmpeg_cleanup方法下,將各個計數器置零,包括:
nb_filtergraphs
nb_output_files
nb_output_streams
nb_input_files
nb_input_streams
置零之後,重復使用ffmpeg_main方法一切正常。
Ⅳ ios中的兩個第三方sdk都用到了ffmpeg,放在一起編譯發生錯誤是怎麼回事
你好。
根據你的描述:
少nm就裝個nm唄;
我10.7.4,xcode4.3.3裝過那個commandTools....
~/Desktop $ type nm
nm is hashed (/usr/bin/nm)
~/Desktop $
Ⅳ ios編譯ffmpeg時如何添加x264的庫
找到問題了編譯的時候首先要連接libx264 ,le-libx264 --enable-gpl --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib 然後要打開這個編碼器--enable-encoder=libx264,我就是這一步搞錯了一直找不到,我在編譯的時候禁掉了所有的編碼器,終於可以繼續走下去了 到DEVDIV.COM網站查看回答詳情>>
Ⅵ 如何讓FFmpeg在iOS上完美編譯
找到問題了編譯的時候首先要連接libx264 ,le-libx264 --enable-gpl --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib 然後要打開這個編碼器--enable-encoder=libx264,我就是這一步搞錯了一直找不到,我在編譯的時候禁掉了所有的編碼器,終於可以繼續走下去了 查看原帖>>
Ⅶ ios ffmepg 解碼mp3成功之後怎麼處理
IOS平台下的ffmpeg編譯簡介,寫在經歷了n翻折騰之後。首先感謝Cocoachina中眾多的資源
IOS下基於H264的音視頻網傳前後走通花了差不多1個多月時間。
先說下總的流程如下:
a)從網路接收H264視頻數據 adpcm音頻數據
b)網路數據輸入到ffmpeg解碼庫 音頻數據輸入到音頻解碼庫(音頻解碼庫為自己所寫)
c)ffmpeg解碼出YUV420P視頻數據 音頻解碼出PCM數據
d)將YUV420P數據轉換為RGB24圖像 用UIImageview輸出 用OPENGL ES輸出也可以(兩種方法均驗證過可行)
e)將音頻PCM數據輸入OPEN AL中輸出
f)以上為整個流程,d1在iphone4上可以達到16楨 左右的效率
下面來說說FFMPEG部分。剛開始接觸ffmpeg的時候遇到的第一個問題就是編譯問題。
1 下載FFMPEG代碼,該步比較簡單可在ffmpeg官方網站上下載(我下的是0.6.5的,下了0.10的沒編譯過部分arm指令)
2 用gcc進行編譯,寫配置信息。該步驟浪費了太多的精力和時間,主要是沒有在ios平台下的經驗導致。
1)編譯的時候不明白版本問題,編譯後才發現每次編譯需要制定不同的處理器模式為3種:armv6 armv7 i386版本
2)configure配置信息,前期犯了各種錯誤。還是對於ffmpeg的configure配置參數步了解導致。另外用gcc編譯的經驗也步豐富。
最終領悟出:配置信息主要為配置gcc的位置和匯編的編譯器位置。
configure命令如下(該段配置信息為iFrameExtractor中。該demo也讓我學習到很多知識,需要的可以在網上搜索下載):
./configure --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-avfilter --enable-cross-compile --arch=arm --target-os=darwin --cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc --as='gas-preprocessor/gas-preprocessor.pl /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk --cpu=cortex-a8 --extra-cflags='-arch armv7' --extra-ldflags='-arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk' --enable-pic
配置成功後 make即可編譯出armv7版本的lib*。a文件。
到此既可以生成ios下需要的ffmpeg靜態庫文件,需要用的時候拖入到項目中即可。
另外還需要添加libbz 、libz的framework
補充:在iOS6中編譯出的。a的庫在armv7s下編譯目前有問題,可以修改target的Valid Architectures只支持Armv7去掉Armv7s