Android - FFmpeg & Mac & AndroidStudio & CMake 环境

Android - FFmpeg & Mac & AndroidStudio & CMake 环境搭建

要学习FFmpeg在android上的使用,就动手包开发环境搭建出来

1.搭建开发环境

2.下载FFmpeg源码,配置源码编译环境

3.集成FFmpeg源码到项目中,开发FFmpeg Hellowworld


一、Google中国版本开发网站下载AndroidStudio相应的版本

下载地址:https://developer.android.google.cn/studio/index.html

二、下载FFmpeg源码,配置源码编译环境

FFmpeg下载地址:https://www.ffmpeg.org/

需要进行修改两个文件(这两个文件时Shell脚本文件)

1.修改configure

2.新建build_android文件


源码内容:16 directories, 46 files

➜  ffmpeg-3.3.4 tree -L 1
.
├── CONTRIBUTING.md
├── COPYING.GPLv2
├── COPYING.GPLv3
├── COPYING.LGPLv2.1
├── COPYING.LGPLv3
├── CREDITS
├── Changelog
├── INSTALL.md
├── LICENSE.md
├── MAINTAINERS
├── Makefile
├── README.md
├── RELEASE
├── RELEASE_NOTES
├── VERSION
├── android
├── android_back
├── arch.mak
├── build_android.sh
├── build_android_one.sh
├── cmdutils.c
├── cmdutils.h
├── cmdutils_common_opts.h
├── cmdutils_opencl.c
├── common.mak
├── compat
├── config.fate
├── config.h
├── config.log
├── config.mak
├── configure
├── configure_back
├── doc
├── ffmpeg.c
├── ffmpeg.h
├── ffmpeg_cuvid.c
├── ffmpeg_dxva2.c
├── ffmpeg_filter.c
├── ffmpeg_opt.c
├── ffmpeg_qsv.c
├── ffmpeg_vaapi.c
├── ffmpeg_vdpau.c
├── ffmpeg_videotoolbox.c
├── ffplay.c
├── ffprobe.c
├── ffserver.c
├── ffserver_config.c
├── ffserver_config.h
├── libavcodec
├── libavdevice
├── libavfilter
├── libavformat
├── libavresample
├── libavutil
├── libpostproc
├── library.mak
├── libswresample
├── libswscale
├── presets
├── tests
├── tools

16 directories, 46 files

1.修改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)'
2.新建build_android文件

#!/bin/sh
#NDK安装目录
NDK=/Users/cangck/Library/Android/sdk/ndk-bundle
#支持的CPU架构
#支持的最小SDK
#android-13 android-15 android-17 android-19 android-22 android-24 android-9
#android-12 android-14 android-16 android-18 android-21 android-23 android-26 repo.prop
#在上述的目录下能够支持的架构如下
#arch-arm
#arch-arm64
#arch-mips
#arch-mips64
#arch-x86
#arch-x86_64
SYSROOT=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
#下面是配置GNU编译c代码是使用到的一些编译代码
function build_one
{
	./configure \
		--prefix=$PREFIX \
		--enable-shared \
		--disable-static \
		--disable-doc \
		--disable-ffmpeg \
		--disable-ffplay \
		--disable-ffprobe \
		--disable-ffserver \
		--disable-avdevice \
		--disable-doc \
		--disable-symver \
		--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
		--target-os=linux \
		--arch=arm \
		--enable-cross-compile \
		--sysroot=$SYSROOT \
		--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
		--extra-ldflags="$ADDI_LDFLAGS" \
		$ADDITIONAL_CONFIGURE_FLAG
		make clean
		make
		make install
}
#指定CPU架构
CPU=arm
#指定编译时生成包的前缀
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
#开始编译
build_one
修改build_android.sh 权限

chmod a+rwx build_android.sh
这些脚本:  ./build_android.sh

稍等片刻没有出错的话等待编译完成就可以在在源码目录下看到下列相应的文件

➜  android tree -L 3  //生成的文件夹脚本中配置的文件产生:PREFIX=$(pwd)/android/$CPU
.
└── arm //相应的CPU架构
    ├── include //包含的头文件
    │   ├── libavcodec
    │   ├── libavfilter
    │   ├── libavformat
    │   ├── libavutil
    │   ├── libswresample
    │   └── libswscale
    └── lib //生成的so库
        ├── libavcodec-57.so //用于各种类型声音/图像编解码
        ├── libavfilter-6.so //包含多媒体处理常用的滤镜功能
        ├── libavformat-57.so//包含多种多媒体容器格式的封装、解封装工具
        ├── libavutil-55.so  //包含一些公共的工具函数
        ├── libswresample-2.so//用于音频重采样和格式转换等功能
        ├── libswscale-4.so  //用于视频场景比例缩放、色彩映射转换
        └── pkgconfig

10 directories, 6 files

新建Android项目,支持NDK的目录结构

android官网的SDK开发教程:https://developer.android.google.cn/ndk/index.html(建议相关的教程使用google官方的教程比较靠谱,可以节约大量的时间)

因为我们只编译了 arm 版本的 so,所以需要把 so 拷到 armeabi-v7a 目录下,完整路径如下

├── build.gradle
├── libs
│   ├── armeabi-v7a
│   │   ├── libavcodec-57.so
│   │   ├── libavfilter-6.so
│   │   ├── libavformat-57.so
│   │   ├── libavutil-55.so
│   │   ├── libswresample-2.so
│   │   └── libswscale-4.so
│   └── include
│       ├── libavcodec
│       ├── libavfilter
│       ├── libavformat
│       ├── libavutil
│       ├── libswresample
│       └── libswscale
├── proguard-rules.pro
└── src
    └── main
        ├── AndroidManifest.xml
        ├── cpp
        ├── java
        └── res

指定JniLibs库的地址,这个是在NDK编译时能够找到相应的库路径或头文件的路径

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

指定abifilter:指定当前软件支持的CPU

 
 
android {
...
defaultConfig {
...
ndk {
abiFilters 'armeabi-v7a'
}
}
}

编写Cmake脚本
Google官网CMake的创建:
cmake_minimum_required(VERSION 3.4.1)
add_library( # 设置库的名字
             native-lib
             # 设置为共享库
             SHARED
             # 编译下面的问生成的库文件时上面的名字
             src/main/cpp/native-lib.cpp )
add_library( avcodec-57  //这是我们编译的库文件
             SHARED  共享库
             IMPORTED ) 
set_target_properties( avcodec-57  //编译的库文件
                       PROPERTIES IMPORTED_LOCATION   //定义导入库的文章
                       ../../../../libs/armeabi-v7a/libavcodec-57.so )
add_library( avfilter-6
             SHARED
             IMPORTED )
set_target_properties( avfilter-6
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libavfilter-6.so )
add_library( avformat-57
             SHARED
             IMPORTED )
set_target_properties( avformat-57
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libavformat-57.so )
add_library( avutil-55
             SHARED
             IMPORTED )
set_target_properties( avutil-55
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libavutil-55.so )
add_library( swresample-2
             SHARED
             IMPORTED )
set_target_properties( swresample-2
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libswresample-2.so )
add_library( swscale-4
             SHARED
             IMPORTED )
set_target_properties( swscale-4
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libswscale-4.so )

#指定头文件的目录地址   
include_directories( libs/include )

//日志文件文件库的这种
find_library(
              log-lib
              log )
#对连接库的指定
target_link_libraries( # Specifies the target library.
                       native-lib
                       avcodec-57
                       avfilter-6
                       avformat-57
                       avutil-55
                       swresample-2
                       swscale-4
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

在java文件中引用下列相应的库文件:下列的库要注意相应的引入顺序,如果顺序不对可能有好多异常出现(后面使用单个so是就不会出现)

static {
    System.loadLibrary("native-lib");
    System.loadLibrary("avcodec-57");
    System.loadLibrary("avfilter-6");
    System.loadLibrary("avformat-57");
    System.loadLibrary("avutil-55");
    System.loadLibrary("swresample-2");
    System.loadLibrary("swscale-4");
}
到目前为止关键点的代码已经完成


参考文档:

http://gavinliu.cn/2017/03/05/Android-FFmpeg-Mac-AndroidStudio-CMake-%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/

http://blog.csdn.net/leixiaohua1020/article/details/47008825

猜你喜欢

转载自blog.csdn.net/cangck_x/article/details/78109585