使用 NDK r9 编译ffmpeg

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

1. 环境 ubuntu 我的是13.10  ndk r9d x86_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, 在jni文件夹中创建lib文件夹,将.so文件拷入lib文件夹中,添加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)  

 8.使用

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

Java代码   收藏代码
  1. LOCAL_PATH := $(call my-dir)  
  2.    
  3. include $(CLEAR_VARS)  

  4. LOCAL_SRC_FILES := $(call all-subdir-java-files)
  5.    
  6. LOCAL_MODULE    := tutorial03  
  7. LOCAL_SRC_FILES += tutorial03.c  
  8. LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid  
  9. LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil  
  10.    
  11. include $(BUILD_SHARED_LIBRARY)   

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


参考:http://blog.csdn.net/cbzhaojay/article/details/8524915

问题2

:libavutil/parseutils.h:158:64: warning: ‘struct tm’ declared inside parameter listlibavutil/parseutils.h:171:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘av_timegm’libavutil/parseutils.c:441:64: warning: ‘struct tm’ declared inside parameter listlibavutil/parseutils.c:441:7: error: conflictingtypes for ‘av_small_strptime’libavutil/parseutils.h:158:7: note: previous declaration of ‘av_small_strptime’ was here

In file included from jni/libavutil/parseutils.c:32:0:
jni/libavutil/parseutils.h:172:64: warning: 'struct tm' declared inside parameter list [enabled by default]
jni/libavutil/parseutils.h:172:64: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
jni/libavutil/parseutils.h:185:25: warning: 'struct tm' declared inside parameter list [enabled by default]
jni/libavutil/parseutils.c:463:64: warning: 'struct tm' declared inside parameter list [enabled by default]
jni/libavutil/parseutils.c:463:7: error: conflicting types for 'av_small_strptime'
jni/libavutil/parseutils.h:172:7: note: previous declaration of 'av_small_strptime' was here
jni/libavutil/parseutils.c: In function 'av_small_strptime':
jni/libavutil/parseutils.c:485:19: error: dereferencing pointer to incomplete type
jni/libavutil/parseutils.c:491:19: error: dereferencing pointer to incomplete type
jni/libavutil/parseutils.c:497:19: error: dereferencing pointer to incomplete type
jni/libavutil/parseutils.c:503:19: error: dereferencing pointer to incomplete type
jni/libavutil/parseutils.c:509:19: error: dereferencing pointer to incomplete type
jni/libavutil/parseutils.c:515:19: error: dereferencing pointer to incomplete type

解决方法看:



把 ffmpeg/libavutil/time.h更名为avtime.h,

同时修改下面文件中的引用libavutil/time.h为libavutil/avtime.h 

ffmpeg/libavformat/avformat.h:211 

ffmpeg/libavformat/avio.c:25 

ffmpeg/libavformat/hls.c:33 

ffmpeg/libavformat/mux.c:39:30

ffmpeg/libavformat/utils.c:40 

ffmpeg/libavutil/time.c:36

原因是重复引用了time.h,在parseutils.c和parseutils.h文件中都引用了,而libavutil/time.h也会被编译的时候引用,而<time.h>却使用的是android ndk工具中的,造成了冲突。


你可能感兴趣的:(使用 NDK r9 编译ffmpeg)