第一个内容:解决上一节课编译bug问题?
问题一:`which yasm`->检测是否安装了yasm程序
#错误一:`which` yasm
#正确一:`which yasm`
问题二:`which brew`->检测是否安装了软件管理器(Homebrew)
#错误二:`which` brew
#正确二:`which brew`
问题三:配置编译CPU架构类型->指定当前编译CPU架构类型
#错误三:"--arch $arch"
#正确三:"-arch $arch"
注意事项
注意一:执行脚本的时候传入参数->"arm64"
Dream$ ./ffmpeg-build.sh arm64
注意二:你要将gas-preprocessor.pl导入到和脚本文件在同一个目录
扩展知识?->课后可以试一试
FFmpeg一共:9个库->常用是7个库
3-4库需要,其他库不需要
选择性编译一些库,不一定编译所有?如何选择?
第二个内容:在iOS平台下集成和应用FFmpeg?
第一个案例:测试我们自己编译库FFmpeg?
选择真机测试
第一步:新建项目
第二步:导入.a静态库和include头文件
第三步:添加系统依赖库
第四步:配置头文件和.a静态库
第五步:在代码中测试FFmpeg测试配置信息
1、引入头文件->FFmpeg
2、定义测试FFmpeg方法
第二个案例:指定打开一个文件?->视频文件?
第三个内容:讲解在Android平台编译.so动态库?->
#!/bin/bash
#第一步:进入到指定目录
cd ffmpeg-3.4
#第二步:指定NDK路径(编译什么样的平台->采用什么样的平台编译器)
#Android平台NDK技术->做C/C++开发->编译Andrroid平台下.so动态库
#注意:放在英文目录(中文目录报错)
#修改一:修改为你自己NDK存放目录
NDK_DIR=/Users/yangshaohong/Desktop/tools/eclipse/android-ndk/android-ndk-r10e
#第三步:配置Android系统版本(支持最小的版本)
#指定使用NDK Platform版本(对应系统版本)
SYSROOT=$NDK_DIR/platforms/android-18/arch-arm
#第四步:指定编译工具链->(通俗:指定编译器)->CPU架构(Android手机通用的CPU架构类型):armeabi
TOOLCHAIN=$NDK_DIR/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
#第五步:指定CPU平台架构类型
#指定编译后的安装目录
ARCH=arm
ADDI_CFLAGS="-marm"
#第六步:指定编译成功之后,.so动态库存放位置
#修改二:这个目录你需要修改为你自己目录
PREFIX=/Users/yangshaohong/Desktop/ffmpeg-android/android-build/$ARCH
#第七步:编写执行编译脚本->调用FFmpeg进行配置
#定义了Shell脚本函数(方法)
function build_armeabi
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-gpl \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-small \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=$ARCH \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--enable-pic \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
}
#第八步:执行函数->开始编译
build_armeabi
echo "Android armeabi builds finished"
执行步骤
第一步:编写Shell脚本(课前准备好了,不去写了)
解释->比iOS要简单一些
注意:真机测试(不用模拟器)
第二步:注意事项
处理之前:目标编译出来.so动态库格式
libavcodec.so.57.2.100
存在问题:你在Android程序中无法加载动态库,编译器报错(报错信息:找不到这个动态库),即使你修改了后缀名为libavcodec.so,依然还是无法运行,这是一个坑
处理之后:.so动态库格式(国外网站,关于FFmpeg安卓开发相关资料查找到的)
libavcodec.so
解决方案
首先:进入FFmpeg-3.4开发包
其次:打开configure文件
最后:修改配置
原始
#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
修改
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
第三步:执行脚本,编译.so动态库(不演示了->耗时)
Dream$ ./build-ffmpeg-armeabi.sh
第四步:集成到项目中
第四个内容:在Android平台下应用FFmpeg的.so动态库?
1、环境搭建
Android平台下的开发:准备好.so动态库
第一步:编译.so动态库?
第二步:新建在Android平台下的NDK项目?
就是说,本身默认Android项目不支持C/C++开发(NDK底层开发),需要我们进行配置
NDK:在Android平台下Google提供的支持C/C++开发一套工具库
注意一:新建项目的时候需要你手动勾选这个支持NDK项目
注意二:尽量勾选在Java中支持处理C/C++异常
意思:C/C++出错了,那么在Java程序中,我们可以捕获这个错误,并且处理
iOS开发:你需要实现的是NDK底层代码->上层Java开发你不需要关心(安卓不需要关心)
目前整个Android领域->会NDK技术不到20%,意味着安卓领域80%以上工程师都不会
第三步:配置NDK环境->FFmpeg->导入FFmpeg开发包
第四步:配置.so动态库和引入头文件->CMakeLists.txt文件中
在课后安装一下Android Studio->安装NDK环境->自动构建NDK环境
注意:直接拷贝,不需要修改
第五步:配置CPU平台架构类型->gradle配置文件中->build.gradle文件
2、案例一:测试FFmpeg环境?
第一步:定义Java方法->类似于定义iOS方法
//native->标记这个方法是一个特殊方法,不是普通的java方法,而是用于与NDK进行交互方法(C/C++语言交互)
//用native进行修饰方法:方法没有实现,具体的实现在C/C++里面
public static native void ffmpegTestConfig();
第二步:定义C/C++方法(NDK方法->和Java方法一一对应)
注意:在CMakeLists.txt配置native-lib.cpp文件,将Java和C/C++进行关联
3、案例二:测试FFmpeg打开文件->视频文件?
第一步:定义Java方法
第二步:定义NDK方法
注意:加上访问sdcard权限
实例工程
https://pan.baidu.com/s/1hsBzZHM