android 移植 ffmpeg (一)

最近两天为了测试使用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
 
生成存放路径PREFIX: 为了最后使用ndk-build生成工具方便,我存放到了ndk环境路径下面.

 

还要注意其它设置了路径的目录是否存在(这主要跟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$

 

 

 

到此,环境配置就完成了。

 

后记

这一篇主要是环境配置。 下一篇将展示实际例子如何使用。

 

最后我的配置源文件:

配置文件及android_build_mac.sh文件下载



转载地址:https://www.2cto.com/kf/201609/545088.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值