我是靠谱客的博主 缓慢钢笔,这篇文章主要介绍编译用于Android的FFmpeg&x264本文介绍了在编译用于Android端的FFmpeg与x264库,现在分享给大家,希望可以做个参考。

本文介绍了在编译用于Android端的FFmpeg与x264库

本次编译环境:MacOs操作系统,FFmpeg-3.3.4,x264,NDK:r15c

0x00 资源准备

下载Android NDK : Google中国开发者网站
terminal
mkdir ~/FFmpeg
cd ~/FFmpeg
git clone http://git.videolan.org/git/x264.git
git clone https://git.ffmpeg.org/ffmpeg.git

0x01 配置NDK环境变量

解压下载好的ndk.tar.gz至~/
terminal
subl ~/.bash_profile

复制代码
1
2
3
4
5
6
7
8
NDK_HOME=~/android-ndk-r15c export NDK_HOME export PATH=${PATH}:$NDK_HOME/toolchains:$NDK_HOME export PREBUILT=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt export PLATFORM=$NDK_HOME/platforms/android-14/arch-arm export TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 # cpu 架构平台,若要编译 x86 则指定 x86 export CPU=armv7-a

0x02 编译x264

编写脚本build_x264.sh
注:编者系统重定向 subl -> 打开sublime text
terminal
subl ~/FFmpeg/build_x264.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
cd x264 export NDK=$NDK_HOME #编译生成库路径 export PREFIX=../libx264 export SYSROOT=$TOOLCHAINS/arm/sysroot ./configure --prefix=$PREFIX --enable-static --enable-shared --enable-pic --disable-asm --disable-cli --host=arm-linux-androideabi --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- --sysroot=$PLATFORM --disable-avs --disable-swscale --disable-lavf --disable-ffms --disable-gpac --disable-lsmash make -j8 make install cd ..

terminal
chmod +x ~/FFmpeg/build_x264.sh

sh ~/FFmpeg/build_x264.sh

该步骤结束后在FFmpeg文件夹下会生成一个libx264文件夹

0x03 编译FFmpeg

terminal
subl ~/FFmpeg/FFmpeg-${version}/build.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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/bin/bash export TMPDIR=/Users/${uesr}/FFmpeg/ffmpeg-${version} #指向FFmpeg根目录 function build_one { EXTRA_CFLAGS="-I./libx264/include" EXTRA_LDFLAGS="-L./libx264/lib" ./configure --prefix=$PREFIX --target-os=android --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- --disable-stripping --disable-asm --disable-doc --arch=arm --sysroot=$PLATFORM --extra-cflags="-I$PLATFORM/usr/include" --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm --disable-shared --enable-runtime-cpudetect --enable-gpl --enable-small --enable-cross-compile --enable-static --enable-version3 --disable-vda --disable-iconv --disable-encoders --enable-libx264 --enable-encoder=libx264 --disable-muxers --enable-muxer=mov --enable-muxer=ipod --enable-muxer=psp --enable-muxer=mp4 --enable-muxer=avi --disable-decoders --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=h264 --enable-decoder=mpeg4 --disable-demuxers --enable-demuxer=h264 --enable-demuxer=mov --disable-parsers --enable-parser=aac --enable-parser=ac3 --enable-parser=h264 --disable-protocols --enable-protocol=file --enable-protocol=rtmp --disable-bsfs --enable-bsf=aac_adtstoasc --enable-bsf=h264_mp4toannexb --disable-indevs --enable-zlib --disable-outdevs --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-postproc --disable-avdevice --disable-symver --disable-ffserver --disable-debug --extra-cflags=$EXTRA_CFLAGS --extra-ldflags=$EXTRA_LDFLAGS $ADDITIONAL_CONFIGURE_FLAG sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h make clean make -j8 make install $TOOLCHAIN/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libx264/lib/libx264.a libavcodec/libavcodec.a libavfilter/libavfilter.a libswresample/libswresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a } # arm v7vfp CPU=armv7-a OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU " PREFIX=./android/$CPU-vfp ADDITIONAL_CONFIGURE_FLAG= build_one

terminal
chmod +x ~/FFmpeg/build.sh
sh ~/FFmpeg/build.sh

0x04 Android工程

创建一个Android工程
在app/src/main下创建文件夹jni
复制文件 ~/FFmpeg下的android/arm…/libffmpeg.so到jni/
复制文件 ffmpeg.c ffmpeg.h ffmpeg_filter.c cmdutils.c cmdutils.h cmdutils_common_opt.c ffmpeg_opt.c 到jni/
修改文件:ffmpeg.c

复制代码
1
2
3
4
5
6
7
8
9
10
11
int main(int argc,char **argv) //改变为 int run(int argc,char **argv) //在函数 ffmpeg_cleanup 的最后添加 ffmpeg_exited = 1; nb_filtergraphs = 0; nb_output_files = 0; nb_output_streams = 0; nb_input_files = 0; nb_input_streams = 0;

修改文件:ffmpeg.h

复制代码
1
2
//在定义函数的末添加 int run(int argc,char **argv);

修改文件cmdutils.c

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
//函数exit_program void exit_program(int ret){ if(program_exit){ program_exit(ret) } exit(ret); } //改变为 void exit_program(int ret){ if(program_exit){ program_exit(ret) } }

创建一个调用类如:FFmpegUtil.java
并在类中声明原生方法

复制代码
1
private static native int run(String[] recommend);

此处打开AndroidStudio中的终端
terminal
cd app/src/main/java
// javah ${包名}.FFmpegUtil

如:javah com.exmaple.ffmpegsimple.FFmpegUtil
会在app/src/main/java目录下生成c头文件,将其移动到jni/
创建文件${刚才创建的头文件}.c
编写该文件

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "com.example.ffmpegsimple.h" #include "ffmpeg.h" #include <string.h> /* * Class: com_example_ffmpegsimple_FFmpegUtil * Method: run * Signature: (Ljava/lang/String;)I */ JNIEXPORT jint JNICALL Java_com_example_ffmpegsimple_FFmpegUtil_run(JNIEnv *env, jclass obj, jobjectArray commands) { int argc = (*env)->GetArrayLength(env, commands); char *argv[argc]; int i; for (i = 0; i < argc; i++) { jstring js = (jstring) (*env)->GetObjectArrayElement(env, commands, i); argv[i] = (char*) (*env)->GetStringUTFChars(env, js, 0); } return run(argc, argv); }

terminal
cd app/src/main/jni
ndk-build
等待执行完成
会在app/src/main下生成两个文件夹
编写app的build.gradle

复制代码
1
2
3
4
5
sourceSets{ main{ jniLibs.srcDir(['src/main/libs']) } }

0x05 最后说两句

在sh build_x264.sh、sh build.sh、ndk-build三步中,一旦出现error代表着编译失败,应谨慎分析原因并排查,祝大家使用愉快

最后

以上就是缓慢钢笔最近收集整理的关于编译用于Android的FFmpeg&x264本文介绍了在编译用于Android端的FFmpeg与x264库的全部内容,更多相关编译用于Android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部