使用 NDK r9 编译ffmpeg

转自:http://wang-peng1.iteye.com/blog/2004897

1. 环境 ubuntu 我的是13.10  ndk r9 64位

2. 下载ffmpeg http://www.ffmpeg.org/download.html  找到 

FFmpeg 2.1.3 "Fourier"

2.1.3 was released on 2014-01-15. It is the latest stable FFmpeg release from the 2.1 release branch, which was cut from master on 2013-10-28. Amongst lots of other changes, it includes all changes from ffmpeg-mt, libav master of 2013-10-27, libav 9 as of 2013-10-27.

It includes the following library versions:

  libavutil      52. 48.101
  libavcodec     55. 39.101
  libavformat    55. 19.104
  libavdevice    55.  5.100
  libavfilter     3. 90.100
  libswscale      2.  5.101
  libswresample   0. 17.104
  libpostproc    52.  3.100

Download bzip2 tarball  下载

下载之后 解压到 $NDK/sources   文件夹下面,这是因为编译快捷以及方便使用

3.  找到 ffmpeg-xxx/configure 找到如下几行:

Java代码   收藏代码
  1. SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'  
  2. LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'  
  3. SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'  
  4. SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'  

 上面几行会导致libavcodec.so.<version> (e.g. libavcodec.so.55),不会被android承认 ,修改为;

Java代码   收藏代码
  1. SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'  
  2. LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'  
  3. SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'  
  4. SLIB_INSTALL_LINKS='$(SLIBNAME)'  

 4. 复制下面的代码到文本中 并命名为 build_android.sh,注意这个文件应该保存到 ffmpeg-xxx/configure 同一个文件夹下

Java代码   收藏代码
  1. #!/bin/bash  
  2. NDK=$HOME/Desktop/adt/android-ndk-r9  
  3. SYSROOT=$NDK/platforms/android-9/arch-arm/  
  4. TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64  
  5. function build_one  
  6. {  
  7. ./configure \  
  8.     --prefix=$PREFIX \  
  9.     --enable-shared \  
  10.     --disable-static \  
  11.     --disable-doc \  
  12.     --disable-ffmpeg \  
  13.     --disable-ffplay \  
  14.     --disable-ffprobe \  
  15.     --disable-ffserver \  
  16.     --disable-avdevice \  
  17.     --disable-doc \  
  18.     --disable-symver \  
  19.     --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \  
  20.     --target-os=linux \  
  21.     --arch=arm \  
  22.     --enable-cross-compile \  
  23.     --sysroot=$SYSROOT \  
  24.     --extra-cflags="-Os -fpic $ADDI_CFLAGS" \  
  25.     --extra-ldflags="$ADDI_LDFLAGS" \  
  26.     $ADDITIONAL_CONFIGURE_FLAG  
  27. make clean  
  28. make  
  29. make install  
  30. }  
  31. CPU=arm  
  32. PREFIX=$(pwd)/android/$CPU   
  33. ADDI_CFLAGS="-marm"  
  34. build_one  

 注意修改 NDK=$HOME/Desktop/adt/android-ndk-r9 这行  

5. 执行 

Java代码   收藏代码
  1. sudo chmod +x build_android.sh  
  2.   
  3. ./build_android.sh  

 6.输出  $NDK/sources/ffmpeg-xxx/android,  arm/lib 和arm/include 

注意 arm/lib包含了两个 library files (e.g.: libavcodec-55.so) 和 symbolic links (e.g.: libavcodec.so) 我们需要删掉 symbolic links .

7. 让ffmpeg Libraries用在我们的工程下

为了使ffmpeg libraries 可以作为 reusable modules, 需要添加一个文件 $NDK/sources/ffmpeg-xxx/android/arm/Android.mk 使用如下内容,

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

 这就是为什么我们把源码放在source文件夹下,ndk会自动寻找

8.使用

 使用 libraries在Android project’s jni/Android.mk file,

Java代码   收藏代码
  1. LOCAL_PATH := $(call my-dir)  
  2.    
  3. include $(CLEAR_VARS)  
  4.    
  5. LOCAL_MODULE    := tutorial03  
  6. LOCAL_SRC_FILES := tutorial03.c  
  7. LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid  
  8. LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil  
  9.    
  10. include $(BUILD_SHARED_LIBRARY)  
  11. $(call import-module,ffmpeg-2.0.1/android/arm)  

 这里你就会发现 我们用到了source中调用了 import-module 使用相对路径去调用。

要在Windows上使用NDK编译FFmpeg,你需要按照以下步骤进行操作: 1. 首先,确保你已经安装了NDK和CMake。你可以从Android开发者网站下载并安装Android Studio,它会自动安装NDK和CMake。 2. 下载FFmpeg源代码。你可以从FFmpeg的官方网站或GitHub上获取最新的源代码。 3. 创建一个用于编译FFmpeg的CMakeLists.txt文件。这个文件描述了编译过程中所需的配置和依赖项。你可以使用以下示例作为起点: ```cmakecmake_minimum_required(VERSION3.4.1) # 设置FFmpeg源代码的路径set(FFMPEG_SOURCE_DIR /path/to/ffmpeg/source) # 设置编译输出的路径set(FFMPEG_OUTPUT_DIR /path/to/ffmpeg/output) # 添加FFmpeg源代码的子目录add_subdirectory(${FFMPEG_SOURCE_DIR} ${FFMPEG_OUTPUT_DIR}) # 添加FFmpeg库到你的项目中add_library(ffmpeg SHARED IMPORTED) set_target_properties(ffmpeg PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_ABI}/libffmpeg.so) # 链接FFmpeg库到你的项目中target_link_libraries(your_project ffmpeg) ``` 在上面的示例中,你需要将`/path/to/ffmpeg/source`替换为你下载的FFmpeg源代码的路径,将`/path/to/ffmpeg/output`替换为你想要生成输出文件的路径。 4. 打开命令提示符或终端,并导航到包含CMakeLists.txt文件的目录。 5. 运行以下命令来生成构建文件: ```shellcmake -DCMAKE_TOOLCHAIN_FILE=/path/to/your/ndk/build/cmake/android.toolchain.cmake -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=21 . ``` 在上面的命令中,将`/path/to/your/ndk/build/cmake/android.toolchain.cmake`替换为你的NDK安装目录中的相应路径。`ANDROID_ABI`和`ANDROID_NATIVE_API_LEVEL`参数可以根据你的需求进行调整。 6. 运行以下命令来编译FFmpeg: ```shellcmake --build . ``` 这将使用CMake生成的构建文件来编译FFmpeg。 请注意,编译FFmpeg可能需要一些时间,具体取决于你的系统配置和源代码的大小。完成后,你将在指定的输出路径中找到编译好的FFmpeg库文件。 这只是一个简单的指导,实际中可能会遇到其他问题。在遇到困难时,你可以参考FFmpeg官方文档或在相关的开发者社区中寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值