FFmpeg

第2讲-FFmepg-iOS+Android平台集成

2017-11-16  本文已影响13人  泰克2008

第一个内容:解决上一节课编译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

上一篇下一篇

猜你喜欢

热点阅读