android 移植 ffmpeg (一)

转自:http://blog.csdn.net/net_wolf_007/article/details/52415578


最近两天为了测试使用ffmpeg获取视频图片的效率问题,玩了一把ffmpeg的移植工作. 在这里作下记录。

所有测试都只在mac系统中测试。


1. 下载ffmpeg 

在方官网页中http://ffmpeg.org/download.html 中有ffmpeg的Git地址:

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

shell中运行到要存放的目录运行上命令

  1. 172-15-70-196:ffmpeg jerome$ pwd  
  2. /Users/jerome/dev/ffmpeg  
  3. 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. 3220 #SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'  
  2. 3221 #LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'  
  3. 3222 #SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'  
  4. 3223 #SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'  
  5. 3224 SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'  
  6. 3225 LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'  
  7. 3226 SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'  
  8. 3227 SLIB_INSTALL_LINKS='$(SLIBNAME)'  

2.2 编译 编译shell命令文件build_andriod_mac.sh

 在/Users/jerome/dev/ffmpeg/ffmpeg中建立build_andriod_mac.sh文件

文件内容为

  1. #!/usr/bin/env bash  
  2.   
  3. export NDK=/Users/jerome/dev/android-ndk-r12b  
  4. export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64  
  5. export PLATFORM=$NDK/platforms/android-23/arch-arm  
  6. export PREFIX=$NDK/sources/ffmpeg/android  
  7. build_one(){  
  8. ./configure --target-os=linux \  
  9.         --prefix=$PREFIX --enable-cross-compile \  
  10.         --enable-runtime-cpudetect --disable-asm \  
  11.         --arch=arm --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \  
  12.         --cross-prefix=$PREBUILT/bin/arm-linux-androideabi \  
  13.         --disable-stripping --nm=$PREBUILT/bin/arm-linux-androideabi-nm \  
  14.         --sysroot=$PLATFORM --enable-gpl --enable-shared --disable-static \  
  15.         --enable-small --disable-ffprobe --disable-ffplay --disable-ffmpeg \  
  16.         --disable-ffserver --disable-debug \  
  17.         --extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"  
  18. }  
  19.   
  20. build_one  
  21.   
  22. make clean  
  23. make  
  24. make install  


接着修改文件权限为可执行 

chmod 777 build_andriod_mac.sh 


几点要修改的说明说明:


 NDK路径:  NDK路径要跟自己设置的版本一致。我的版本是 

  1. <span style="white-space:pre">    </span>export NDK=/Users/jerome/dev/android-ndk-r12b  

PRODUILT变量:  这个要一致,我就在这问题是查了好久才解决的,就是确保你的路径存在!

  1. <pre name="code" class="python"><span style="white-space:pre">  </span>export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64  
  1. <pre name="code" class="python">PLATFORM变量: 设置ok ! export PLATFORM=$NDK/platforms/android-23/arch-arm  
生成存放路径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. 172-15-70-196:ffmpeg jerome$ pwd  
  2. /Users/jerome/dev/ffmpeg/ffmpeg  
  3. 172-15-70-196:ffmpeg jerome$ chmod 777 build_andriod_mac.sh   
  4. 172-15-70-196:ffmpeg jerome$ ./build_andriod_mac.sh   

运行完之后会生成 include, lib文件:
  1. 172-15-70-196:android jerome$ pwd  
  2. /Users/jerome/dev/android-ndk-r12b/sources/ffmpeg/android  
  3. 172-15-70-196:android jerome$ ls  
  4. include lib  
  5. 172-15-70-196:android jerome$   

列出生成的文件:
  1. libavdevice-57.so   libavfilter.so      libavutil-55.so     libpostproc.so      libswscale-4.so  
  2. 172-15-70-196:android jerome$ ls -l lib  
  3. total 19640  
  4. -rwxr-xr-x   1 jerome  staff  6336784  9  2 17:51 libavcodec-57.so  
  5. lrwxr-xr-x   1 jerome  staff       16  9  2 17:51 libavcodec.so -> libavcodec-57.so  
  6. -rwxr-xr-x   1 jerome  staff    98208  9  2 17:51 libavdevice-57.so  
  7. lrwxr-xr-x   1 jerome  staff       17  9  2 17:51 libavdevice.so -> libavdevice-57.so  
  8. -rwxr-xr-x   1 jerome  staff  1358684  9  2 17:51 libavfilter-6.so  
  9. lrwxr-xr-x   1 jerome  staff       16  9  2 17:51 libavfilter.so -> libavfilter-6.so  
  10. -rwxr-xr-x   1 jerome  staff  1450792  9  2 17:51 libavformat-57.so  
  11. lrwxr-xr-x   1 jerome  staff       17  9  2 17:51 libavformat.so -> libavformat-57.so  
  12. -rwxr-xr-x   1 jerome  staff   304764  9  2 17:51 libavutil-55.so  
  13. lrwxr-xr-x   1 jerome  staff       15  9  2 17:51 libavutil.so -> libavutil-55.so  
  14. -rwxr-xr-x   1 jerome  staff    24240  9  2 17:51 libpostproc-54.so  
  15. lrwxr-xr-x   1 jerome  staff       17  9  2 17:51 libpostproc.so -> libpostproc-54.so  
  16. -rwxr-xr-x   1 jerome  staff   112832  9  2 17:51 libswresample-2.so  
  17. lrwxr-xr-x   1 jerome  staff       18  9  2 17:51 libswresample.so -> libswresample-2.so  
  18. -rwxr-xr-x   1 jerome  staff   322464  9  2 17:51 libswscale-4.so  
  19. lrwxr-xr-x   1 jerome  staff       15  9  2 17:51 libswscale.so -> libswscale-4.so  
  20. drwxr-xr-x  10 jerome  staff      340  9  2 17:51 pkgconfig  
  21. 172-15-70-196:android jerome$ ls -l include  
  22. total 0  
  23. drwxr-xr-x  19 jerome  staff   646  9  2 17:51 libavcodec  
  24. drwxr-xr-x   4 jerome  staff   136  9  2 17:51 libavdevice  
  25. drwxr-xr-x   7 jerome  staff   238  9  2 17:51 libavfilter  
  26. drwxr-xr-x   5 jerome  staff   170  9  2 17:51 libavformat  
  27. drwxr-xr-x  75 jerome  staff  2550  9  2 17:51 libavutil  
  28. drwxr-xr-x   4 jerome  staff   136  9  2 17:51 libpostproc  
  29. drwxr-xr-x   4 jerome  staff   136  9  2 17:51 libswresample  
  30. drwxr-xr-x   4 jerome  staff   136  9  2 17:51 libswscale  
  31. 172-15-70-196:android jerome$   

到此,编译就ok了。

5.添加Android.mk文件

这文件作用主要是告诉ndk怎么把ffmpeg的.so的路径及头文件连接起来。

文件内容

  1. LOCAL_PATH:= $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4. LOCAL_MODULE:= libavcodec  
  5. LOCAL_SRC_FILES:= lib/libavcodec-57.so  
  6. LOCAL_EXPORT_C_INCLUDES := include  
  7. include $(PREBUILT_SHARED_LIBRARY)  
  8.   
  9. include $(CLEAR_VARS)  
  10. LOCAL_MODULE:= libavformat  
  11. LOCAL_SRC_FILES:= lib/libavformat-57.so  
  12. LOCAL_EXPORT_C_INCLUDES := include  
  13. include $(PREBUILT_SHARED_LIBRARY)  
  14.   
  15. include $(CLEAR_VARS)  
  16. LOCAL_MODULE:= libswscale  
  17. LOCAL_SRC_FILES:= lib/libswscale-4.so  
  18. LOCAL_EXPORT_C_INCLUDES := include  
  19. include $(PREBUILT_SHARED_LIBRARY)  
  20.   
  21. include $(CLEAR_VARS)  
  22. LOCAL_MODULE:= libavutil  
  23. LOCAL_SRC_FILES:= lib/libavutil-55.so  
  24. LOCAL_EXPORT_C_INCLUDES := include  
  25. include $(PREBUILT_SHARED_LIBRARY)  
  26.   
  27. include $(CLEAR_VARS)  
  28. LOCAL_MODULE:= libavfilter  
  29. LOCAL_SRC_FILES:= lib/libavfilter-6.so  
  30. LOCAL_EXPORT_C_INCLUDES := include  
  31. include $(PREBUILT_SHARED_LIBRARY)  
  32.   
  33. include $(CLEAR_VARS)  
  34. LOCAL_MODULE:= libswresample  
  35. LOCAL_SRC_FILES:= lib/libswresample-2.so  
  36. LOCAL_EXPORT_C_INCLUDES := include  
  37. include $(PREBUILT_SHARED_LIBRARY)  

Android.mk文件简要说明:

LOCAL_PATH: $(call my-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. 172-15-70-196:android jerome$ pwd  
  2. /Users/jerome/dev/android-ndk-r12b/sources/ffmpeg/android  
  3. 172-15-70-196:android jerome$ ls  
  4. Android.mk      include     lib  
  5. 172-15-70-196:android jerome$   



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


后记

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


最后我的配置源文件:

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值