Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库
文件准备
要编译生成Android需要以下文件
- NDK
- ffmpeg源代码
NDK下载
NDK可以去Google下载,也可以在国内一些Android网站下载
这里推荐两个Android的下载网站
Android Studio 中文组
AndroidDevTools
ffmpeg
ffmpeg在其官网可以直接下载,不需要翻墙
官网下载地址
配置环境
我这里下载的是android-ndk-r10e-linux-x86_64.zip
和ffmpeg-2.6.9.tar.gz
NDK
解压
下载的NDK,Google下载的话是一个zip压缩包,其他地方下载可能是bin文件,其实都是压缩包
zip解压缩:unzip android-ndk-r10e-linux-x86_64.zip
bin解压:./android-ndk-r10e-linux-x86_64.bin
配置环境变量
vim ~/.bashrc
在文件末尾加上,NDKROOT为ndk所在路径1
2export NDKROOT=/usr/ndk/android-ndk-r10e
export PATH=$NDKROOT:$PATH
使配置的环境变量立即生效source ~/.bashrc
使用ndk-build -v
检查设置是否生效
如果输出类似下列语句,则代表配置成功1
2
3
4
5GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
ffmpeg
ffmpeg解压tar -xzvf ffmpeg-2.6.9.tar.gz
编译ffmpeg
编写ffmpeg编译脚本,后缀名为.sh
,这里我命名为build_android.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
make clean
export NDK=/usr/ndk/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure
--target-os=linux \
--prefix=$PREFIX \
--arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
如果在linux端不识别,那么可以使用dos2unix
转换一下文件
注意,在编译脚本里不可有多余空格,否则会报一堆莫名其妙的错误
使用chmod 755 build_android.sh
更改文件权限,使其可以执行
此时便可以使用./build_android.sh
编译ffmpeg了
此时编译出来的动态库后缀名不对,那么就需要修改configure文件,使其生成的动态库符合标准
使用./configure --help
可以查看如何配置configure文件
修改configure文件
将以下四句做修改1
2
3
4SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
改为1
2
3
4SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
此时再编译就可以得到合格的so动态库了
在编译途中会生成一些.h
和.mak
文件
编译完成生成android文件夹,生成的动态库和头文件都在这里
Android app测试(转码功能)
创建Android项目
建立jni文件夹,将include目录拷贝至jni目录下
拷贝so动态库
libavcodec-56.so
libavdevice-56.so
libavfilter-5.so
libavformat-56.so
libavutil-54.so
libpostproc-53.so
libswresample-1.so
libswscale-3.so
拷贝至jni目录编写
Android.mk
文件
1 | LOCAL_PATH := $(call my-dir) |
- 编写
Application.mk
文件
1 | APP_ABI := armeabi |
- 实现头文件
1 |
|
- 创建调用类,注意动态库之间有相互关系,其调用顺序一定要对
1 | public class VideoUtils { |
- 主活动文件
1 | import java.io.File; |
- 布局文件
1 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
- 权限添加
1 | <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> |
之后编译,生成apk,在手机上测试,没问题