项目作者: wanbanjiesan

项目描述 :
android mac环境下的ffmpeg编译
高级语言: C
项目地址: git://github.com/wanbanjiesan/android-ffmpeg-x264.git
创建时间: 2017-07-21T07:59:28Z
项目社区:https://github.com/wanbanjiesan/android-ffmpeg-x264

开源协议:

下载


android_ffmpeg_x264

android mac环境下的ffmpeg编译

编译环境是:

  • Mac 10.12.4 (16E195)
  • Android Studio 2.3.1
  • NDK android-ndk-r14b
  • ffmpeg-3.3.2
  • x264 lastest

下载地址:

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

x264: git clone http://git.videolan.org/git/x264.git

ndk: https://developer.android.com/ndk/downloads/index.html 需要注意系统,而且不需要配置环境变量

在下载过程中可以去编译脚本

新建脚本: build_with_x264.sh

  1. cd x264
  2. export TEP=/Users/you/Desktop/ffmpeg
  3. export PLATFORM_VERSION=android-9
  4. export ANDROID_NDK=/Users/you/Desktop/android-ndk-r14b #ndk 目录根据你的安装目录
  5. export TOOLCHAIN=$TEP/fftoolchain #toolchain 安装目录
  6. export SYSROOT=$TOOLCHAIN/sysroot/
  7. export PLATFORM=$ANDROID_NDK/platforms/$PLATFORM_VERSION/arch-arm
  8. export PREFIX=$TEP/android-lib #编译结果的目录
  9. export OUT_PREFIX=$TEP/../264fflib
  10. #生成toolchain目录,这一段可以在第一次运行后注释掉
  11. $ANDROID_NDK/build/tools/make-standalone-toolchain.sh \
  12. --toolchain=arm-linux-androideabi-4.9 \
  13. --platform=$PLATFORM_VERSION --install-dir=$TOOLCHAIN
  14. #
  15. ./configure \
  16. --prefix=$PREFIX \
  17. --enable-static \
  18. --enable-shared \
  19. --enable-pic \
  20. --disable-asm \
  21. --disable-cli \
  22. --host=arm-linux \
  23. --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
  24. --sysroot=$PLATFORM
  25. make -j8
  26. make install
  27. cd ..
  28. # 加入x264编译库
  29. EXTRA_CFLAGS="-I./android-lib/include"
  30. EXTRA_LDFLAGS="-L./android-lib/lib"
  31. ./configure \
  32. --target-os=linux \
  33. --prefix=$OUT_PREFIX \
  34. --enable-cross-compile \
  35. --enable-runtime-cpudetect \
  36. --disable-asm \
  37. --disable-doc \
  38. --arch=arm \
  39. --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
  40. --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
  41. --disable-stripping \
  42. --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
  43. --sysroot=$PLATFORM \
  44. --enable-gpl \
  45. --enable-static \
  46. --disable-shared \
  47. --enable-version3 \
  48. --enable-small \
  49. --disable-vda \
  50. --disable-iconv \
  51. --disable-encoders \
  52. --enable-libx264 \
  53. --enable-encoder=libx264 \
  54. --disable-muxers \
  55. --enable-muxer=mov \
  56. --enable-muxer=ipod \
  57. --enable-muxer=psp \
  58. --enable-muxer=mp4 \
  59. --enable-muxer=avi \
  60. --disable-decoders \
  61. --enable-decoder=aac \
  62. --enable-decoder=aac_latm \
  63. --enable-decoder=h264 \
  64. --enable-decoder=mpeg4 \
  65. --disable-demuxers \
  66. --enable-demuxer=h264 \
  67. --enable-demuxer=mov \
  68. --disable-parsers \
  69. --enable-parser=aac \
  70. --enable-parser=ac3 \
  71. --enable-parser=h264 \
  72. --disable-protocols \
  73. --enable-protocol=file \
  74. --enable-protocol=rtmp \
  75. --disable-bsfs \
  76. --enable-bsf=aac_adtstoasc \
  77. --enable-bsf=h264_mp4toannexb \
  78. --disable-indevs \
  79. --enable-zlib \
  80. --disable-outdevs \
  81. --disable-ffprobe \
  82. --disable-ffplay \
  83. --disable-ffmpeg \
  84. --disable-ffserver \
  85. --disable-debug \
  86. --extra-cflags=$EXTRA_CFLAGS \
  87. --extra-ldflags=$EXTRA_LDFLAGS
  88. make clean
  89. make -j8
  90. make install
  91. # 这段解释见后文
  92. $TOOLCHAIN/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$OUT_PREFIX/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o $OUT_PREFIX/libffmpeg.so \
  93. android-lib/lib/libx264.a \
  94. libavcodec/libavcodec.a \
  95. libavfilter/libavfilter.a \
  96. libswresample/libswresample.a \
  97. libavformat/libavformat.a \
  98. libavutil/libavutil.a \
  99. libswscale/libswscale.a \
  100. libpostproc/libpostproc.a \
  101. libavdevice/libavdevice.a \
  102. -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a

等待前面的2个源码下载完成后,修改下文件结构

ffmpeg

—x264

—build_with_x264.sh

至此,准备工作完成,接下来是重点,开始编译…

cd ffmpeg

chmod +x build_with_x264.sh

sh ./build_with_x264.sh

……

中间可能出现多次warning,无视就好。。。

最终会出现一下代码结构:


说明编译ok

接下来是导入as,网上很多文章都是用旧的jni方式,而studio从2.2开始引入cmake的方式来更好的加载控制c代码

cmake最大的有点就是可以编辑c代码,并且有代码提示和错误提醒,这对编码来说是非常舒服的

废话不多说,上目录结构先:

gradle在android中追加

  1. android {
  2. compileSdkVersion 25
  3. buildToolsVersion "25.0.3"
  4. defaultConfig {
  5. applicationId "com.ffmpegmy"
  6. minSdkVersion 16
  7. targetSdkVersion 25
  8. versionCode 1
  9. versionName "1.0"
  10. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  11. externalNativeBuild {
  12. cmake {
  13. cppFlags ""
  14. abiFilters "armeabi"
  15. }
  16. }
  17. }
  18. buildTypes {
  19. release {
  20. minifyEnabled false
  21. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  22. }
  23. }
  24. sourceSets.main {
  25. jniLibs.srcDirs = ['libs']
  26. jni.srcDirs = []
  27. }
  28. externalNativeBuild {
  29. cmake {
  30. path "CMakeLists.txt"
  31. }
  32. }
  33. }

cmake文件:

  1. set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../libs)
  2. add_library( libffmpeg
  3. SHARED
  4. IMPORTED )
  5. set_target_properties( libffmpeg
  6. PROPERTIES IMPORTED_LOCATION
  7. ../../../../libs/${ANDROID_ABI}/libffmpeg.so )
  8. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
  9. include_directories(libs/include)
  10. target_link_libraries( # Specifies the target library.
  11. native-lib libffmpeg
  12. # Links the target library to the log library
  13. # included in the NDK.
  14. ${log-lib} )

native-lib.cpp:

  1. #include <jni.h>
  2. #include <string>
  3. extern "C"
  4. {
  5. #include <libavfilter/avfilter.h>
  6. JNIEXPORT jstring JNICALL
  7. Java_com_ffmpegmy_MainActivity_stringFromJNI(
  8. JNIEnv *env,
  9. jobject /* this */) {
  10. char info[40000] = {0};
  11. avfilter_register_all();
  12. AVFilter *f_temp = (AVFilter *)avfilter_next(NULL);
  13. while(f_temp != NULL) {
  14. sprintf(info, "%s%s\n", info, f_temp->name);
  15. f_temp = f_temp->next;
  16. }
  17. return env->NewStringUTF(info);
  18. }
  19. }

参考:
http://blog.csdn.net/byhook/article/details/51971652
https://github.com/dxjia/ffmpeg-compile-shared-library-for-android
http://blog.csdn.net/leixiaohua1020/article/details/47010637
http://zheteng.me/android/2016/05/25/build-ffmpeg-for-android-with-x264/