ios 編譯ffmpeg 支援 x264 fdk-aac openssl 並裁剪庫大小
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2018-10-11更新
android平臺編譯 右轉
新的報錯資訊
./libavutil/arm/asm.S:50:9: error: unknown directive
.arch armv7-a
原因是xcode9.4版本 去掉了32位編譯器的支援,如果還想編譯通過armv7的版本
需要下載並安裝xcode9.1的版本,安裝完成後將xcodebuild切換到9.1的版本上去
,就可以通過armv7的編譯了
sudo xcode-select --switch /Applications/Xcode9.1.app/Contents/Developer
通過修改ffmepg的指令碼shell檔案來實現以下兩個功能模組
1.新增openssl 到ffmpeg庫裡面來支援https的專案
首先 在指令碼新增 openssl編譯好的在你電腦的絕對路徑
OPENSSL=/XXXX/openssl-OpenSSL_1_1_0-stable/build/universal
然後仿照x264 的寫法 新增ssl支援
if [ "OPENSSL" ]
then
#echo $CONFIGURE_FLAGS
CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-openssl"
fi
# avres
最後將lib 和include 的.a庫和標頭檔案的索引指向寫對,這裡也是仿照x264的寫法
if [ "$OPENSSL" ]
then
CFLAGS="$CFLAGS -I$OPENSSL/include"
LDFLAGS="$LDFLAGS -L$OPENSSL/lib -lcrypto -lssl"
fi
這種寫法是通用的,如果你要編譯其他的lib庫然後引入到ffmpeg 裡面
只要遵循這三步,就能夠編譯了。
2.裁剪ffmpeg庫,讓庫的體積減少到最小
其實ffmpeg在編譯的過程中,打包了很多沒必要的功能塊進去,
這樣使得包的大小進一步的擴大,
只要編譯的時候不編譯進去即可。
CONFIGURE_FLAGS="$CONFIGURE_FLAGS --disable-decoders --enable-decoder=h264 --enable-decoder=aac" CONFIGURE_FLAGS="$CONFIGURE_FLAGS --disable-encoders --enable-encoder=aac --enable-encoder=mjpeg" CONFIGURE_FLAGS="$CONFIGURE_FLAGS --disable-filters" CONFIGURE_FLAGS="$CONFIGURE_FLAGS --disable-muxers"
我這裡的寫法是關掉全部解碼器 然後再開啟h264 和aac 的解碼器
關閉全部編碼器 開啟aac和jpeg的編碼器,關掉全部複用器 關掉全部濾鏡
寫在指令碼32行後面即可,不過不能直接抄,因為每個公司業務需要的功能
是不一樣的,只要按照關閉掉全部功能後再次開啟部分功能即可。
你每次編譯的時候 注意終端會一開始打印出來整個編譯會編譯哪些東西的
有把握的都可以刪掉。
關掉這些可以節省一半的包的大小。
除此之外,應該關閉掉模擬器的編譯環境 只支援armv7 和arm64 即可。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
正文
1.音視訊開發需要引入x264 和fdk-aac的 庫
參考本篇文章進行 ffmpeg 的ios 環境下的編譯
我在編譯的過程中,遇到了自己打的fdk-aac編譯不過的情況,
最後下載了這篇文章的原始碼,把他的fdk-aac 摳出來,然後
放在自己的ffmpeg指令碼同級目錄下,就生成.a通過了。
libfdk_aac not found 問題
補充 我打fdk-aac失敗的原因是 指令碼不對
經過測試這個指令碼才能夠打包成功打出來的是20多M大小
3.編寫ffmpeg 的程式碼
引入標頭檔案,並註冊所有的ffmpeg 元件
遇到了兩個問題,
"av_register_all()", referenced from:
就是改寫成下面的格式
extern "C" {
#include "libavformat/avformat.h"
}
_參考這篇文章解決了x264的問題
其實就是x264的庫不存在,因為只引入了ffmpeg 的庫,並沒有
並沒有新增x264的庫,所以也拖進去,加標頭檔案即可。
fdk-aac同理。
#import "AppDelegate.h"
extern "C" {
#include "libavformat/avformat.h"
}
#include <libavcodec/avcodec.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
av_register_all();
printf("%s\n", avcodec_configuration());
return YES;
}
列印結果
--target-os=darwin --arch=arm64 --cc='xcrun -sdk iphoneos clang' --as='gas-preprocessor.pl -arch aarch64 -- xcrun -sdk iphoneos clang' --enable-cross-compile --disable-debug --disable-programs --disable-doc --enable-pic --enable-gpl --enable-libx264 --enable-libfdk-aac --enable-nonfree --extra-cflags='-arch arm64 -mios-version-min=9.0 -fembed-bitcode -I/Users/yeyifan/Documents/VideoAudio/ios-build/ffmpegbuild/x264-iOS/include -I/Users/yeyifan/Documents/VideoAudio/ios-build/ffmpegbuild/fdk-aac-ios/include' --extra-ldflags='-arch arm64 -mios-version-min=9.0 -fembed-bitcode -L/Users/yeyifan/Documents/VideoAudio/ios-build/ffmpegbuild/x264-iOS/lib -L/Users/yeyifan/Documents/VideoAudio/ios-build/ffmpegbuild/fdk-aac-ios/lib' --prefix=/Users/yeyifan/Documents/VideoAudio/ios-build/ffmpegbuild/thin/arm64
表示整個專案已經跑起來了