最近两天为了测试使用ffmpeg获取视频图片的效率问题,玩了一把ffmpeg的移植工作. 在这里作下记录。
所有测试都只在mac系统中测试。
1. 下载ffmpeg
在方官网页中http://ffmpeg.org/download.html 中有ffmpeg的git地址:
1
|
git clone https:
//git.ffmpeg.org/ffmpeg.git ffmpeg
|
shell中运行到要存放的目录运行上命令
1
2
3
|
172
-
15
-
70
-
196
:ffmpeg jerome$ pwd
/Users/jerome/dev/ffmpeg
172
-
15
-
70
-
196
:ffmpeg jerome$ git clone https:
//git.ffmpeg.org/ffmpeg.git ffmpeg
|
就会在当前目录中生成ffmpeg子目录,目录中包含ffmpeg的源代码。
我目前的源码目录为 :/Users/jerome/dev/ffmpeg/ffmpeg
2. 编译ffmpeg
2.1 修改 configure文件
下面是我注释掉的和修改的内容
1
2
3
4
5
6
7
8
|
3220
#SLIBNAME_WITH_MAJOR=
'$(SLIBNAME).$(LIBMAJOR)'
3221
#LIB_INSTALL_EXTRA_CMD=
'$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
3222
#SLIB_INSTALL_NAME=
'$(SLIBNAME_WITH_VERSION)'
3223
#SLIB_INSTALL_LINKS=
'$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
3224
SLIBNAME_WITH_MAJOR=
'$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3225
LIB_INSTALL_EXTRA_CMD=
'$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
3226
SLIB_INSTALL_NAME=
'$(SLIBNAME_WITH_MAJOR)'
3227
SLIB_INSTALL_LINKS=
'$(SLIBNAME)'
|
2.2 编译 编译shell命令文件build_andriod_mac.sh
在/Users/jerome/dev/ffmpeg/ffmpeg中建立build_andriod_mac.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
|
#!/usr/bin/env bash
export NDK=/Users/jerome/dev/android-ndk-r12b
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-
4.9
/prebuilt/darwin-x86_64
export PLATFORM=$NDK/platforms/android-
23
/arch-arm
export PREFIX=$NDK/sources/ffmpeg/android
build_one(){
./configure --target-os=linux \
--prefix=$PREFIX --enable-cross-compile \
--enable-runtime-cpudetect --disable-asm \
--arch=arm --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi \
--disable-stripping --nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM --enable-gpl --enable-shared --disable-
static
\
--enable-small --disable-ffprobe --disable-ffplay --disable-ffmpeg \
--disable-ffserver --disable-debug \
--extra-cflags=
"-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"
}
build_one
make clean
make
make install
|
接着修改文件权限为可执行
chmod 777build_andriod_mac.sh
几点要修改的说明说明:
NDK路径:NDK路径要跟自己设置的版本一致。我的版本是
1
|
<span style=
"white-space:pre"
> </span>export NDK=/Users/jerome/dev/android-ndk-r12b
|
PRODUILT变量: 这个要一致,我就在这问题是查了好久才解决的,就是确保你的路径存在!
1
|
|
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
1
|
|
1
|
|
PLATFORM变量: 设置ok ! export PLATFORM=$NDK/platforms/android-23/arch-arm
1
|
|
还要注意其它设置了路径的目录是否存在(这主要跟ndk版本有关)。
3. 安装ndk(如果没有安装可要进行更新)
官方地址https://developer.android.com/ndk/downloads/index.html
目前官方地址不好下载,我找了个服务器进行下载http://mirrors.neusoft.edu.cn/android/repository/?C=M&O=D
按时间倒序排序 找到最新的版本:
我是mac系统所以下载了android-ndk-r12b-darwin-x86_64.zip 版本。进行解压到目录/Users/jerome/dev/, 在这目录下生成了ndk目录android-ndk-r12b, 所以ndk路径就为
1
|
/Users/jerome/dev/android-ndk-r12b
|
就可以正常使用了。
4. 编译ffmpeg
1
2
3
4
|
172
-
15
-
70
-
196
:ffmpeg jerome$ pwd
/Users/jerome/dev/ffmpeg/ffmpeg
172
-
15
-
70
-
196
:ffmpeg jerome$ chmod
777
build_andriod_mac.sh
172
-
15
-
70
-
196
:ffmpeg jerome$ ./build_andriod_mac.sh
|
运行完之后会生成include, lib文件:
1
2
3
4
5
|
172
-
15
-
70
-
196
:android jerome$ pwd
/Users/jerome/dev/android-ndk-r12b/sources/ffmpeg/android
172
-
15
-
70
-
196
:android jerome$ ls
include lib
172
-
15
-
70
-
196
:android jerome$
|
列出生成的文件:
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
|
libavdevice-
57
.so libavfilter.so libavutil-
55
.so libpostproc.so libswscale-
4
.so
172
-
15
-
70
-
196
:android jerome$ ls -l lib
total
19640
-rwxr-xr-x
1
jerome staff
6336784
9
2
17
:
51
libavcodec-
57
.so
lrwxr-xr-x
1
jerome staff
16
9
2
17
:
51
libavcodec.so -> libavcodec-
57
.so
-rwxr-xr-x
1
jerome staff
98208
9
2
17
:
51
libavdevice-
57
.so
lrwxr-xr-x
1
jerome staff
17
9
2
17
:
51
libavdevice.so -> libavdevice-
57
.so
-rwxr-xr-x
1
jerome staff
1358684
9
2
17
:
51
libavfilter-
6
.so
lrwxr-xr-x
1
jerome staff
16
9
2
17
:
51
libavfilter.so -> libavfilter-
6
.so
-rwxr-xr-x
1
jerome staff
1450792
9
2
17
:
51
libavformat-
57
.so
lrwxr-xr-x
1
jerome staff
17
9
2
17
:
51
libavformat.so -> libavformat-
57
.so
-rwxr-xr-x
1
jerome staff
304764
9
2
17
:
51
libavutil-
55
.so
lrwxr-xr-x
1
jerome staff
15
9
2
17
:
51
libavutil.so -> libavutil-
55
.so
-rwxr-xr-x
1
jerome staff
24240
9
2
17
:
51
libpostproc-
54
.so
lrwxr-xr-x
1
jerome staff
17
9
2
17
:
51
libpostproc.so -> libpostproc-
54
.so
-rwxr-xr-x
1
jerome staff
112832
9
2
17
:
51
libswresample-
2
.so
lrwxr-xr-x
1
jerome staff
18
9
2
17
:
51
libswresample.so -> libswresample-
2
.so
-rwxr-xr-x
1
jerome staff
322464
9
2
17
:
51
libswscale-
4
.so
lrwxr-xr-x
1
jerome staff
15
9
2
17
:
51
libswscale.so -> libswscale-
4
.so
drwxr-xr-x
10
jerome staff
340
9
2
17
:
51
pkgconfig
172
-
15
-
70
-
196
:android jerome$ ls -l include
total
0
drwxr-xr-x
19
jerome staff
646
9
2
17
:
51
libavcodec
drwxr-xr-x
4
jerome staff
136
9
2
17
:
51
libavdevice
drwxr-xr-x
7
jerome staff
238
9
2
17
:
51
libavfilter
drwxr-xr-x
5
jerome staff
170
9
2
17
:
51
libavformat
drwxr-xr-x
75
jerome staff
2550
9
2
17
:
51
libavutil
drwxr-xr-x
4
jerome staff
136
9
2
17
:
51
libpostproc
drwxr-xr-x
4
jerome staff
136
9
2
17
:
51
libswresample
drwxr-xr-x
4
jerome staff
136
9
2
17
:
51
libswscale
172
-
15
-
70
-
196
:android jerome$
|
到此,编译就ok了。
5.添加Android.mk文件
这文件作用主要是告诉ndk怎么把ffmpeg的.so的路径及头文件连接起来。
文件内容
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
|
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-
57
.so
LOCAL_EXPORT_C_INCLUDES := include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-
57
.so
LOCAL_EXPORT_C_INCLUDES := include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-
4
.so
LOCAL_EXPORT_C_INCLUDES := include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-
55
.so
LOCAL_EXPORT_C_INCLUDES := include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-
6
.so
LOCAL_EXPORT_C_INCLUDES := include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswresample
LOCAL_SRC_FILES:= lib/libswresample-
2
.so
LOCAL_EXPORT_C_INCLUDES := include
include $(PREBUILT_SHARED_LIBRARY)
|
Android.mk文件简要说明:
LOCAL_PATH:$(callmy-dir)
把当前文件夹(即:Android.mk所在的路径)设置成 当前路径。
include$(CLEAR_VARS)
请除掉除LOCAL_PATH之外的变量信息,目前是为了防止引入不必要的环境变量,影响后面的模块的处理流程
LOCAL_MODULE:=libavcodec
设置当前模块名为 libavcodec
LOCAL_SRC_FILES:=lib/libavcodec-57.so
当前模块对应的源文件,ndk默认在 LOCAL_PATH路径下查找,如果找不到,会报错。
LOCAL_EXPORT_C_INCLUDES:=include
设置头文件目录,目的是ndk编译时能够找到头文件,也是LOCAL_PATH下的include文件。也可以写成
LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include 效果是一样的。
include$(PREBUILT_SHARED_LIBRARY
负责收集自从上次调用 ‘include$(CLEAR_VARS)’以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。并根据其规则生成动态库。
当前例子中,只是把 lib/libavcodec-57.so文件进行了复制。
上述文件定义了库有:libavcodec,libavformat,libswscale,libavutil,libavfilter,libswresample. 而生成的lib中还有libpostproc,libavdevice, 在我第一个例子中没有用到这两个库,所以就没有添加进Android.mk文件中,自己偷了一下懒,为了使用方便,读者可自行加上。
当前的路径内容为:
1
2
3
4
5
|
172
-
15
-
70
-
196
:android jerome$ pwd
/Users/jerome/dev/android-ndk-r12b/sources/ffmpeg/android
172
-
15
-
70
-
196
:android jerome$ ls
Android.mk include lib
172
-
15
-
70
-
196
:android jerome$
|
到此,环境配置就完成了。
后记
这一篇主要是环境配置。 下一篇将展示实际例子如何使用。
最后我的配置源文件: