转自: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中运行到要存放的目录运行上命令
- 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文件
下面是我注释掉的和修改的内容
- 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文件
文件内容为
- #!/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 777 build_andriod_mac.sh
几点要修改的说明说明:
NDK路径: NDK路径要跟自己设置的版本一致。我的版本是
- <span style="white-space:pre"> </span>export NDK=/Users/jerome/dev/android-ndk-r12b
PRODUILT变量: 这个要一致,我就在这问题是查了好久才解决的,就是确保你的路径存在!
- <pre name="code" class="python"><span style="white-space:pre"> </span>export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
- <pre name="code" class="python">PLATFORM变量: 设置ok ! export PLATFORM=$NDK/platforms/android-23/arch-arm
还要注意其它设置了路径的目录是否存在(这主要跟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路径就为
- /Users/jerome/dev/android-ndk-r12b
就可以正常使用了。
4. 编译ffmpeg
- 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文件:
- 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$
列出生成的文件:
- 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的路径及头文件连接起来。
文件内容
- 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文件简要说明:
当前的路径内容为:
- 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$
到此,环境配置就完成了。
后记
这一篇主要是环境配置。 下一篇将展示实际例子如何使用。