从事多媒体软件开发的人几乎没有不知道FFmpeg的,很多视频播放器都是基于FFmpeg开发的。如今最火的智能手机操作系统Android上的很多第三方视频播放器也是基于FFmpeg实现全格式支持。由于Android通常跑在ARM处理器上,而且Android使用了自己的libc库(即bionic),因此要在Android上编译和使用FFmpeg需要做一些移植工作,好在FFmpeg本身用C写成,很好地支持跨平台移植,实现这个目的并不难,事实上已经有很多前辈做过这方面的工作并公开了他们的成果。

1. Rockplayer:

http://rockplayer.freecoder.org/index_cn.html

http://blog.csdn.net/harry_helei/article/details/6322767

2. havlenapetr:

http://github.com/havlenapetr/FFMpeg

http://blog.csdn.net/scut1135/article/details/6536157

http://hi.baidu.com/eefolks/blog/item/e0329e4682859129cefca351.html

http://ajavn.com/anzhuotuandui/4351.html

3. halfninja:

https://github.com/halfninja/android-ffmpeg-x264

4. olvaffe's:

http://gitorious.org/~olvaffe/ffmpeg/ffmpeg-android

http://www.nujk.com/ffmpeg-on-android

5. 流媒体开发论坛 - 罗索工作室:

http://www.rosoo.net/a/201108/14834.html

http://bbs.rosoo.net/thread-6252-1-1.html

当下本人也做这方面的事情,主要是优化ffmpeg编解码的性能,当然首先就是要搭建环境,编译代码,测试代码性能,然后优化模块,编译测试和调试,最终再测试性能:看了很多文章,对于一些新手是有点帮助,但是都不是很全面,下面简单记录下我如何搭建环境,如何编译,测试:

可以使用Rockplayer的方案进行实践。Rockplayer是Android上最有名的第三方视频播放器之一,其开发者根据LGPL协议公开了所使用的FFmpeg源码,该方案用Android NDK将FFmpeg源码编译生成一个单独的共享库libffmpeg.so,其中静态链接了libavformat、libavcodec、libavutil等模块,要使用FFmpeg只需要调用这一个.so即可。当然有了这个库还只是第一步,要利用FFmpeg开发一个自己的播放器或者把FFmpeg集成到Android本身的播放引擎stagefright中还需要很多其他工作,包括针对硬件平台进行优化。目前我做的只是编译出libffmpeg.so以及将FFmpeg自带的工具ffmpeg在adb shell中跑起来。我是在Android 3.2(Honeycomb)上编译FFmpeg,所用NDK版本为r7,在Android的其他版本上编译也大同小异。

题外话:Rockplayer之前也和他们谈过合作的事情,一家几个人搞得小型公司(其实也谈不上公司了),office在上海张江一个不起眼的小区里,也不能说他们没有技术含量,只能说他们找到一个突破口,能挣点小钱,他们的android手机播放器设计原则是支持要全,画质要清晰,性能不是主要,面向中高档手机,配置相对来说就高些。

下面把具体编译步骤描述如下,假定NDK安装在~/android-ndk-r7:

1. 首先从FFmpeg官网下载最新的release版本源码ffmpeg-0.11.tar.gz解压缩到Android源码树的ffmpeg/下。

2 准备一个编译脚本build_android.sh并放在ffmpeg/下面,这个脚本也是Rockplayer提供的,需做一些修改,其内容附在后面。我目前用的也会附在后面。

3 在ffmpeg目录下运行./build_android.sh开始编译FFmpeg,编译好的libffmpeg.so会放在文件夹android里面,一共有3个版本分别对应3种ARM体系结构,包括armv7-a、armv7-a-vfp、armv6_vfp,根据所运行的硬件平台选取其中一个版本。为了编译使用FFmpeg的程序时可以方便地找到libffmpeg.so,可将它复制到$OUT/system/lib/和$OUT/obj/lib/,当然这一步也可以加在build_android.sh中做。

4. 接下来就是编译可执行文件ffmpeg了,这个工具可以在命令行下完成FFmpeg提供的几乎所有功能包括编码、解码、转码等,也是用来调试和验证很有用的工具。其实上述编译完后在$ANDROID_BUILD_TOP/external/ffmpeg/下也会生成ffmpeg,但是在设备上无法运行。为了编出能在设备上运行的ffmpeg,可以写一个简单的Android.mk,其内容如下:

[cpp] view plain copy print ?
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. LOCAL_SRC_FILES:=\
  4. cmdutils.c\
  5. ffmpeg.c
  6. LOCAL_C_INCLUDES:=
  7. LOCAL_SHARED_LIBRARIES:=\
  8. libffmpeg
  9. LOCAL_PRELINK_MODULE:=false
  10. LOCAL_MODULE:=ffmpeg
  11. include$(BUILD_EXECUTABLE)

也可以在E:\android-ndk-r7-windows\android-ndk-r7\samples\test-libstdc++\jni这个目录修改下Android.mk, 修改为:

[cpp] view plain copy print ?
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. LOCAL_SRC_FILES:=ffmpeg.ccmdutils.c
  4. #LOCAL_PREBUILT_LIBS:=libffmpeg
  5. LOCAL_ARM_MODE:=arm
  6. LOCAL_C_INCLUDES+=\
  7. $(LOCAL_PATH)/include\
  8. $(LOCAL_PATH)/include/libavcodec\
  9. $(LOCAL_PATH)/\
  10. $(LOCAL_PATH)/include/libavfilter\
  11. $(LOCAL_PATH)/include/libavdevice\
  12. $(LOCAL_PATH)/include/libavutil
  13. #LOCAL_LDLIBS:=-L$(LOCAL_PATH)-lffmpeg
  14. LOCAL_LDLIBS:=libffmpeg.so
  15. LOCAL_MODULE:=ffmpeg
  16. include$(BUILD_EXECUTABLE)


当然要把ffmpeg.c cmdutils.c和libffmpeg.so拷贝到当前目录。

5. 将上面编好的libffmpeg.so和ffmpeg分别用adb push复制到设备的/system/lib/和/system/bin/,push之前可先对libffmpeg.so做一下strip否则太大。现在就可以在adb shell中运行ffmpeg了,使用方法与在PC上相同。当然如果要用到其他开源库例如x264那么还需要把它们也移植到Android。

以上是基本的步骤,仅供参考,可以根据具体情况修改build_android.sh里面的配置选项。如前所述,编译FFmpeg只是第一步,后续还有很多工作需要做,今后如果有进展再贴上来。

最后附上build_android.sh供参考,在此也感谢Rockplayer的开发者:

[cpp] view plain copy print ?
  1. #!/bin/bash
  2. ######################################################
  3. #FFmpegbuildsscriptforAndroid+ARMplatform
  4. #
  5. #Thisscriptisreleasedundertermof
  6. #CDDL(http://www.opensource.org/licenses/cddl1)
  7. #Wrotebypinxue(~@gmail.com)fromRockPlayer.com
  8. #2010-8~2011-4
  9. ######################################################
  10. ######################################################
  11. #Usage:
  12. #putthisscriptintopofFFmpegsourcetree
  13. #./build_android
  14. #
  15. #Itgeneratesbinaryforfollowingarchitectures:
  16. #ARMv6
  17. #ARMv6+VFP
  18. #ARMv7+VFPv3-d16(Tegra2)
  19. #ARMv7+Neon(Cortex-A8)
  20. #
  21. #Customizing:
  22. #1.Feelfreetochange./configureparametersformorefeatures
  23. #2.ToadaptotherARMvariants
  24. #set$CPUand$OPTIMIZE_CFLAGS
  25. #callbuild_one
  26. ######################################################
  27. NDK=~/android-ndk-r7
  28. PLATFORM=$NDK/platforms/android-8/arch-arm/
  29. PREBUILT=../../prebuilt/linux-x86/toolchain/arm-eabi-4.4.3
  30. functionbuild_one
  31. {
  32. #-fasm:required.Androidheaderfileusesasmkeywordinsteadof__asm__,butmostofcdialect(likeansi,c99,gnu99)implies-fno-asm.
  33. #~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/asm/byteorder.h:Infunction'___arch__swab32':
  34. #~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/asm/byteorder.h:25:error:expected')'before':'token
  35. #-fno-short-enums:optimized.ElseFFmpegobjwillgenerateahugenumberofwarningforvariable-sizeenums,
  36. #thoughwemaysuppressthemby--no-enum-size-warning,itwouldbebettertoavoidit.
  37. #.../ld:warning:cmdutils.ousesvariable-sizeenumsyettheoutputistouse32-bitenums;useofenumvaluesacrossobjectsmayfail
  38. #--extra-libs="-lgcc":required.Elsecannotsolvesomeruntimefunctionsymbols
  39. #...undefinedreferenceto`__aeabi_f2uiz'
  40. #--enable-protocols:required.Withoutthisoption,thefileopenalwaysfailsmysteriously.
  41. #FFmpeg'sav_open_input_filewillinvokefileformatprobingfunctions,butbecausemostofusefuldemuxershasflagofzero
  42. #whichcausethemareignoredduringfileformatproblingandfalltourlstreamparsing,
  43. #ifprotocolsaredisabled,thefile://urlcannotbeopenedaswell.
  44. #$PREBUILT/bin/arm-eabi-ardlibavcodec/libavcodec.ainverse.o:required.
  45. #FFmpegincludestwocopiesofinverse.cbothinlibavutilandlibavcodecforperformanceconsideration(notsurethebenifityet)
  46. #Withoutthisstep,finalldofgeneratinglibffmpeg.sowillfailsilently,ifinvokeldthroughgcc,gccwillcollectmorereasonableerrormessage.
  47. #-llog:debugonly,FFmpegitselfdoesn'trequireitatall.
  48. #Withthisoption,wemaysimplyincludes"utils/Log.h"anduseLOGx()toobserveFFmpeg'sbehavior
  49. #PS,itseemsthetoolchainimplies-DNDEBUGsomewhere,itwouldbesafertousefollowingsyntax
  50. ##ifdefNDEBUG
  51. ##undefNDEBUG
  52. ##defineHAVE_NDEBUG
  53. ##endif
  54. ##include"utils/Log.h"
  55. ##ifdefHAVE_NDEBUG
  56. ##defineNDEBUG
  57. ##undefHAVE_NDEBUG
  58. ##endif
  59. #--whole-archive:required.Elseldgenerateasmall.sofile(about15k)
  60. #--no-stdlib:required.Androiddoesn'tusestandardcruntimebutinviteditsownwheal(bioniclibc)becauseoflicenseconsideration.
  61. #spacebefore\ofconfigurelines:requiredforsomeoptions.Elsenextlinewillbemergedintopreviouslines'scontentandcauseproblem.
  62. #Especiallythe--extra-cflags,thenextlinewillpasstogccinthiscaseandconfigurewillsaygcccannotcreateexecutable.
  63. #manyoptionsmentionedbyarticlesoverinternetareimpliedby-O2or-O3already,neednotrepeatatall.
  64. #twoorthreecommonoptimizationcflagsareomittedbecausenotsureaboutthetradeoffyet.invokeNDKbuildsystemwithV=1tofindthem.
  65. #-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.xmentionedbyalmosteveryarticlesoverinternet,butitisnotrequiredtospecifyatall.
  66. #-Dipv6mr_interface=ipv6mr_ifindex:required.Androidinetheaderdoesn'tuseipv6mr_interfacewhichisrequiredbyrfc,seemsitgeneratethisuserspaceheaderfiledirectlyfromkernelheaderfile,butLinuxkernelhasdecidedtokeepitsownnameforeverandaskuserspaceheadertouserfcname.
  67. #HAVE_SYS_UIO_H:required.Else:
  68. #Infileincludedfrom~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/linux/socket.h:29,
  69. #from~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/sys/socket.h:33,
  70. #fromlibavformat/network.h:35,
  71. #fromlibavformat/utils.c:46:
  72. #~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/linux/uio.h:19:error:redefinitionof'structiovec'
  73. #
  74. #--disable-doc:requiredbecauseofstrangebugoftoolchain.
  75. ./configure--target-os=linux\
  76. --prefix=$PREFIX\
  77. --enable-cross-compile\
  78. --extra-libs="-lgcc"\
  79. --arch=arm\
  80. --cc=$PREBUILT/bin/arm-eabi-gcc\
  81. --cross-prefix=$PREBUILT/bin/arm-eabi-\
  82. --nm=$PREBUILT/bin/arm-eabi-nm\
  83. --sysroot=$PLATFORM\
  84. --extra-cflags="-O3-fpic-DANDROID-DHAVE_SYS_UIO_H=1-Dipv6mr_interface=ipv6mr_ifindex-fasm-Wno-psabi-fno-short-enums-fno-strict-aliasing-finline-limit=300$OPTIMIZE_CFLAGS"\
  85. --disable-shared\
  86. --enable-static\
  87. --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib-L$PLATFORM/usr/lib-nostdlib-lc-lm-ldl-llog"\
  88. --enable-parsers\
  89. --enable-encoders\
  90. --enable-decoders\
  91. --enable-muxers\
  92. --enable-demuxers\
  93. --enable-swscale\
  94. --enable-swscale-alpha\
  95. --disable-ffplay\
  96. --disable-ffprobe\
  97. --disable-ffserver\
  98. --enable-network\
  99. --enable-indevs\
  100. --disable-bsfs\
  101. --enable-filters\
  102. --enable-avfilter\
  103. --enable-protocols\
  104. --enable-asm\
  105. $ADDITIONAL_CONFIGURE_FLAG
  106. #makeclean
  107. make-j4install
  108. $PREBUILT/bin/arm-eabi-ardlibavcodec/libavcodec.ainverse.o
  109. $PREBUILT/bin/arm-eabi-ld-rpath-link=$PLATFORM/usr/lib-L$PLATFORM/usr/lib-sonamelibffmpeg.so-shared-nostdlib-z,noexecstack-Bsymbolic--whole-archive--no-undefined-o$PREFIX/libffmpeg.solibavcodec/libavcodec.alibavformat/libavformat.alibavutil/libavutil.alibavfilter/libavfilter.alibswscale/libswscale.alibavdevice/libavdevice.alibswresample/libswresample.a-lc-lm-lz-ldl-llog--warn-once--dynamic-linker=/system/bin/linker$PREBUILT/lib/gcc/arm-eabi/4.4.3/libgcc.a
  110. }
  111. #armv6
  112. CPU=armv6
  113. OPTIMIZE_CFLAGS="-marm-march=$CPU"
  114. PREFIX=./android/$CPU
  115. ADDITIONAL_CONFIGURE_FLAG=
  116. #build_one
  117. #armv7vfpv3
  118. CPU=armv7-a
  119. OPTIMIZE_CFLAGS="-mfloat-abi=softfp-mfpu=vfpv3-d16-marm-march=$CPU"
  120. PREFIX=./android/$CPU
  121. ADDITIONAL_CONFIGURE_FLAG=
  122. build_one
  123. #armv7vfp
  124. CPU=armv7-a
  125. OPTIMIZE_CFLAGS="-mfloat-abi=softfp-mfpu=vfp-marm-march=$CPU"
  126. PREFIX=./android/$CPU-vfp
  127. ADDITIONAL_CONFIGURE_FLAG=
  128. build_one
  129. #armv7n
  130. CPU=armv7-a
  131. OPTIMIZE_CFLAGS="-mfloat-abi=softfp-mfpu=neon-marm-march=$CPU-mtune=cortex-a8"
  132. PREFIX=./android/$CPU
  133. ADDITIONAL_CONFIGURE_FLAG=--enable-neon
  134. build_one
  135. #armv6+vfp
  136. CPU=armv6
  137. OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP-mfloat-abi=softfp-mfpu=vfp-marm-march=$CPU"
  138. PREFIX=./android/${CPU}_vfp
  139. ADDITIONAL_CONFIGURE_FLAG=
  140. build_one


下面是我使用的 build_android.sh文件:

[cpp] view plain copy print ?
  1. #!/bin/bash
  2. ######################################################
  3. #FFmpegbuildsscriptforAndroid+ARMplatform
  4. #
  5. #Thisscriptisreleasedundertermof
  6. #CDDL(http://www.opensource.org/licenses/cddl1)
  7. ######################################################
  8. #Usage:
  9. #putthisscriptintopofFFmpegsourcetree
  10. #./build_android
  11. #
  12. #Itgeneratesbinaryforfollowingarchitectures:
  13. #ARMv6
  14. #ARMv6+VFP
  15. #ARMv7+VFPv3-d16(Tegra2)
  16. #ARMv7+Neon(Cortex-A8)
  17. #
  18. #Customizing:
  19. #1.Feelfreetochange./configureparametersformorefeatures
  20. #2.ToadaptotherARMvariants
  21. #set$CPUand$OPTIMIZE_CFLAGS
  22. #callbuild_one
  23. ######################################################
  24. NDK=E:/android-ndk-r7-windows/android-ndk-r7
  25. PLATFORM=$NDK/platforms/android-8/arch-arm/
  26. PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows
  27. functionbuild_one
  28. {
  29. #-fasm:required.Androidheaderfileusesasmkeywordinsteadof__asm__,butmostofcdialect(likeansi,c99,gnu99)implies-fno-asm.
  30. #~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/asm/byteorder.h:Infunction'___arch__swab32':
  31. #~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/asm/byteorder.h:25:error:expected')'before':'token
  32. #-fno-short-enums:optimized.ElseFFmpegobjwillgenerateahugenumberofwarningforvariable-sizeenums,
  33. #thoughwemaysuppressthemby--no-enum-size-warning,itwouldbebettertoavoidit.
  34. #.../ld:warning:cmdutils.ousesvariable-sizeenumsyettheoutputistouse32-bitenums;useofenumvaluesacrossobjectsmayfail
  35. #--extra-libs="-lgcc":required.Elsecannotsolvesomeruntimefunctionsymbols
  36. #...undefinedreferenceto`__aeabi_f2uiz'
  37. #--enable-protocols:required.Withoutthisoption,thefileopenalwaysfailsmysteriously.
  38. #FFmpeg'sav_open_input_filewillinvokefileformatprobingfunctions,butbecausemostofusefuldemuxershasflagofzero
  39. #whichcausethemareignoredduringfileformatproblingandfalltourlstreamparsing,
  40. #ifprotocolsaredisabled,thefile://urlcannotbeopenedaswell.
  41. #$PREBUILT/bin/arm-linux-androideabi-ardlibavcodec/libavcodec.ainverse.o:required.
  42. #FFmpegincludestwocopiesofinverse.cbothinlibavutilandlibavcodecforperformanceconsideration(notsurethebenifityet)
  43. #Withoutthisstep,finalldofgeneratinglibffmpeg.sowillfailsilently,ifinvokeldthroughgcc,gccwillcollectmorereasonableerrormessage.
  44. #-llog:debugonly,FFmpegitselfdoesn'trequireitatall.
  45. #Withthisoption,wemaysimplyincludes"utils/Log.h"anduseLOGx()toobserveFFmpeg'sbehavior
  46. #PS,itseemsthetoolchainimplies-DNDEBUGsomewhere,itwouldbesafertousefollowingsyntax
  47. ##ifdefNDEBUG
  48. ##undefNDEBUG
  49. ##defineHAVE_NDEBUG
  50. ##endif
  51. ##include"utils/Log.h"
  52. ##ifdefHAVE_NDEBUG
  53. ##defineNDEBUG
  54. ##undefHAVE_NDEBUG
  55. ##endif
  56. #--whole-archive:required.Elseldgenerateasmall.sofile(about15k)
  57. #--no-stdlib:required.Androiddoesn'tusestandardcruntimebutinviteditsownwheal(bioniclibc)becauseoflicenseconsideration.
  58. #spacebefore\ofconfigurelines:requiredforsomeoptions.Elsenextlinewillbemergedintopreviouslines'scontentandcauseproblem.
  59. #Especiallythe--extra-cflags,thenextlinewillpasstogccinthiscaseandconfigurewillsaygcccannotcreateexecutable.
  60. #manyoptionsmentionedbyarticlesoverinternetareimpliedby-O2or-O3already,neednotrepeatatall.
  61. #twoorthreecommonoptimizationcflagsareomittedbecausenotsureaboutthetradeoffyet.invokeNDKbuildsystemwithV=1tofindthem.
  62. #-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.xmentionedbyalmosteveryarticlesoverinternet,butitisnotrequiredtospecifyatall.
  63. #-Dipv6mr_interface=ipv6mr_ifindex:required.Androidinetheaderdoesn'tuseipv6mr_interfacewhichisrequiredbyrfc,seemsitgeneratethisuserspaceheaderfiledirectlyfromkernelheaderfile,butLinuxkernelhasdecidedtokeepitsownnameforeverandaskuserspaceheadertouserfcname.
  64. #HAVE_SYS_UIO_H:required.Else:
  65. #Infileincludedfrom~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/linux/socket.h:29,
  66. #from~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/sys/socket.h:33,
  67. #fromlibavformat/network.h:35,
  68. #fromlibavformat/utils.c:46:
  69. #~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/linux/uio.h:19:error:redefinitionof'structiovec'
  70. #
  71. #--disable-doc:requiredbecauseofstrangebugoftoolchain.
  72. ./configure--target-os=linux\
  73. --prefix=$PREFIX\
  74. --enable-cross-compile\
  75. --extra-libs="-lgcc"\
  76. --arch=arm\
  77. --enable-memalign-hack\
  78. --enable-gpl\
  79. --cc=$PREBUILT/bin/arm-linux-androideabi-gcc\
  80. --cross-prefix=$PREBUILT/bin/arm-linux-androideabi-\
  81. --nm=$PREBUILT/bin/arm-linux-androideabi-nm\
  82. --sysroot=$PLATFORM\
  83. --extra-cflags="-O3-fpic-DANDROID-DHAVE_SYS_UIO_H=1-Dipv6mr_interface=ipv6mr_ifindex-fasm-Wno-psabi-fno-short-enums-fno-strict-aliasing-finline-limit=300$OPTIMIZE_CFLAGS"\
  84. --disable-shared\
  85. --enable-static\
  86. --extra-ldflags="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x-Wl,-rpath-link=$PLATFORM/usr/lib-L$PLATFORM/usr/lib-nostdlib$PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/crtbegin.o$PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/crtend.o-L$PLATFORM/usr/lib-lc-lm-ldl-llog"\
  87. --enable-parsers\
  88. --enable-decoders\
  89. --enable-swscale\
  90. --disable-ffplay\
  91. --disable-ffprobe\
  92. --disable-ffserver\
  93. --enable-network\
  94. --enable-indevs\
  95. --enable-optimizations\
  96. --enable-asm\
  97. --enable-swresample\
  98. --disable-debug
  99. $ADDITIONAL_CONFIGURE_FLAG
  100. #makeclean
  101. make-j4install
  102. $PREBUILT/bin/arm-linux-androideabi-ardlibavcodec/libavcodec.ainverse.o
  103. $PREBUILT/bin/arm-linux-androideabi-ld-rpath-link=$PLATFORM/usr/lib-L$PLATFORM/usr/lib-sonamelibffmpeg.so-shared-nostdlib-z,noexecstack-Bsymbolic--whole-archive--no-undefined-o$PREFIX/libffmpeg.solibavcodec/libavcodec.alibavformat/libavformat.alibavutil/libavutil.alibavfilter/libavfilter.alibswscale/libswscale.alibswresample/libswresample.alibavresample/libavresample.alibpostproc/libpostproc.a-lc-lm-lz-ldl-llog--warn-once--dynamic-linker=/system/bin/linker$PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
  104. }
  105. ##armv6
  106. #CPU=armv6
  107. #OPTIMIZE_CFLAGS="-marm-march=$CPU"
  108. #PREFIX=./android/$CPU
  109. #ADDITIONAL_CONFIGURE_FLAG=
  110. ##build_one
  111. #
  112. ##armv7vfpv3
  113. #CPU=armv7-a
  114. #OPTIMIZE_CFLAGS="-mfloat-abi=softfp-mfpu=vfpv3-d16-marm-march=$CPU"
  115. #PREFIX=./android/$CPU
  116. #ADDITIONAL_CONFIGURE_FLAG=
  117. #build_one
  118. #
  119. ##armv7vfp
  120. #CPU=armv7-a
  121. #OPTIMIZE_CFLAGS="-mfloat-abi=softfp-mfpu=vfp-marm-march=$CPU"
  122. #PREFIX=./android/$CPU-vfp
  123. #ADDITIONAL_CONFIGURE_FLAG=
  124. #build_one
  125. #armv7n
  126. CPU=armv7-a
  127. OPTIMIZE_CFLAGS="-mfloat-abi=softfp-mfpu=neon-marm-march=$CPU-mtune=cortex-a8"
  128. PREFIX=./android/$CPU
  129. ADDITIONAL_CONFIGURE_FLAG=--enable-neon
  130. build_one
  131. ##armv6+vfp
  132. #CPU=armv6
  133. #OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP-mfloat-abi=softfp-mfpu=vfp-marm-march=$CPU"
  134. #PREFIX=./android/${CPU}_vfp
  135. #ADDITIONAL_CONFIGURE_FLAG=
  136. #build_one


6. 把编译好的libffmpeg.so 和 可执行文件 ffmpeg 文件push到 手机里面运行测试! 下面是操作步骤:

a: 拷贝文件到手机sdcard

E:\android-ndk-r7-windows\android-ndk-r7\samples\test-libstdc++\libs\armeabi>

拷贝可执行文件
adb push ffmpeg /sdcard/ttt
4507 KB/s (144248 bytes in 0.031s)

拷贝库

adb push liffmpeg.so /sdcard/ttt
3756 KB/s (8233079 bytes in 2.140s)

b: 从手机sdcard 拷贝到系统bin目录和系统lib目录

E:\android-ndk-r7-windows\android-ndk-r7\samples\test-libstdc++\libs\armeabi>adb
shell
$ su
su
# cd /system/bin
cd /system/bin

# rm ffmpeg
rm ffmpeg
# cat /sdcard/ttt/ffmpeg > ffmpeg
cat /sdcard/ttt/ffmpeg > ffmpeg

# chmod 777 ffmpeg
chmod 777 ffmpeg

# cd ../lib
cd /system/lib

# rm libffmpeg.so
rm libffmpeg.so
# cat /sdcard/ttt/libffmpeg.so >libffmpeg.so
cat /sdcard/ttt/libffmpeg.so >libffmpeg.so

# chmod 777 libffmpeg.so
chmod 777 libffmpeg.so

# cd ../bin
cd /system/bin


运行可执行文件:
./ffmpeg -i /sdcard/ttt/test.264 /sdcard/ttt/output.yuv

更多相关文章

  1. Android简明开发教程九:创建应用程序框架
  2. 基于Eclipse的Android开发(一)——创建第一个Android项目
  3. 在Android设备上运行纯java代码
  4. android设备连接到pc进行应用程序调试
  5. 如何在android 中编译alsa-utils工具
  6. 如何在Android移植使用最新的ffmpeg
  7. Android基础之Android的系统体系结构
  8. Android(安卓)UI开发专题(四) View自绘控件
  9. Android开发手记一 NDK编程实例

随机推荐

  1. LINQ : 谈谈LINQ TO SQL中的直接加载和延
  2. 创建视图时ORA-01031
  3. 老鸟帮帮忙:能用字数最少的SQL语句来实现
  4. Mysql Thread stack 说明【hiberntae集成
  5. 如果在详细信息表中找到记录,则显示Y / N
  6. 如何使用SQL Server在此查询中按天分组结
  7. 黑客经验谈 MSSQL SA权限入侵的感悟
  8. 原因及解决:java.sql.SQLException: 无效
  9. MySQL数据切分、负载均衡和集群
  10. Mysql5.7.10新加用户