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大小

2.新建一个xcode 项目使用ffmpeg,
参考了这篇文章的最后一张图片进行修改head search paths 来保证静态库的头文件能够查找的到

3.编写ffmpeg 的代码
引入头文件,并注册所有的ffmpeg 组件

遇到了两个问题,

"av_register_all()", referenced from:

以上面为关键字 搜索第一个的结果就是答案,
原因是C++ 中引入 c 的代码 要用 extern 的方式来引用头文件。

就是改写成下面的格式

extern "C" {
#include "libavformat/avformat.h"
}

_参考这篇文章解决了x264的问题
其实就是x264的库不存在,因为只引入了ffmpeg 的库,并没有
并没有添加x264的库,所以也拖进去,加头文件即可。
fdk-aac同理。

#import "AppDelegate.h"
extern "C" {
#include "libavformat/avformat.h"
}
#include 
@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

表示整个项目已经跑起来了

你可能感兴趣的:(ios 编译ffmpeg 支持 x264 fdk-aac openssl 并裁剪库大小)