FFmpeg解码库裁剪和调试三--Android Studio调试FFmpeg

来源:互联网 发布:java snmp协议 编辑:程序博客网 时间:2024/06/06 01:37

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源项目。FFmpeg是在Linux平台下开发,而Android是现在非常火爆的移动平台,由于Android平台与Linux的亲缘关系,所以将FFmpeg源代码移植到Android平台比前面讲述过的VS平台调试方法相比自然是简单许多。

       本章主要介绍提取FFmpeg中的H264代码并在Android Studio中调试的详细步骤,H265代码的提取方式雷同。主要分为:选择解码库源文件,修改配置文件和源文件和调试解码源代码三部分。

1.  选择解码库源文件

在前面VS调试方法中我们已经说明了,确定解码库源代码的基本方法是用FFmpeg库自带的configure脚步,具体的实现步骤如下所示。

1)由于最终提取的代码是要在Android平台运行,需要借助于NDK进行编译,但是常用的Cygwin或者Ubuntu环境或者系统等只能产生在PC机上正确编译的config.h和config.asm文件。所以要想产生能使用NDK正确编译的config.h和config.asm文件,需要对configure添加一些额外的参数。如图1.1(a)所示,其中TEMPDIR是一个临时目录,主要用于GCC编译过程中产生一些临时文件,如果不设置该目录,则将导致GCC编译测试失败,最终导致configure失败,如图1.1(b)所示;NDKROOT是NDK编译工具所在的目录;其中target-os、arch、cpu、cross-prefix、sysroot等指定编译相关的软硬件配置,如cross-prefix指定编译器GCC相关信息等;正确configure之后将产生如图1.1(c)和(d)所示的结果,其中(d)中的警告并不会对我们获取所需的源文件产生影响,所以可以忽略;

2)然后使用图1.2(a)所示的make命令,将会得到如图1.2(b)所示的source.txt的文本文件,该文件中对应的源程序即为H264解码库所需的源文件,由于我们在configure的时候开启了优化,所以还包括了NEON优化相关的代码;

3)建立一个Android Studio (或者Eclipse)工程将第二步中获得的源码文件信息写入到CMakeList.txt (或者Android_lib.mk)文件中,如图1.3所示。由于该CMakeList.txt中有汇编文件,所以额外添加了一句“enable_language(ASM)”启用CMake的汇编语言支持功能。

[plain] view plain copy
  1. #!/bin/bash  
  2. export TEMPDIR="D:/tmp"  
  3. export NDKROOT="D:/Android/sdk/ndk-bundle"  
  4. PREBUILT=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64  
  5. SYSROOT=$NDKROOT/platforms/android-9/arch-arm  
  6. ./configure --target-os=linux \  
  7.             --arch=arm \  
  8.             --cpu=armv7-a \  
  9.             --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \  
  10.             --sysroot=$SYSROOT \  
  11.             --disable-ffmpeg \  
  12.             --disable-ffplay \  
  13.             --disable-ffserver \  
  14.             --disable-ffprobe \  
  15.             --enable-neon \  
  16.             --disable-everything \  
  17.             --enable-decoder=h264 \  
  18.             --enable-parser=h264 \  
  19.             --enable-demuxer=h264 \  
  20.             --enable-protocol=file  
(a)

(b)                                                          (c)


(d)

图1.1. FFmpeg中configure配置

(a)

[plain] view plain copy
  1. CC  libavdevice/alldevices.o  
  2. CC  libavdevice/avdevice.o  
  3. CC  libavdevice/utils.o  
  4. AR  libavdevice/libavdevice.a  
  5. CC  libavfilter/allfilters.o  
  6. CC  libavfilter/audio.o  
  7. CC  libavfilter/avfilter.o  
  8. CC  libavfilter/avfiltergraph.o  
  9. CC  libavfilter/buffersink.o  
  10. CC  libavfilter/buffersrc.o  
  11. CC  libavfilter/drawutils.o  
  12. CC  libavfilter/fifo.o  
  13. CC  libavfilter/formats.o  
  14. CC  libavfilter/framepool.o  
  15. CC  libavfilter/graphdump.o  
  16. CC  libavfilter/graphparser.o  
  17. CC  libavfilter/opencl_allkernels.o  
  18. CC  libavfilter/pthread.o  
  19. CC  libavfilter/transform.o  
  20. CC  libavfilter/video.o  
  21. AR  libavfilter/libavfilter.a  
  22. CC  libavformat/allformats.o  
  23. CC  libavformat/avio.o  
  24. CC  libavformat/aviobuf.o  
  25. CC  libavformat/cutils.o  
  26. CC  libavformat/dump.o  
  27. CC  libavformat/file.o  
  28. CC  libavformat/format.o  
  29. CC  libavformat/h264dec.o  
  30. CC  libavformat/id3v1.o  
  31. CC  libavformat/id3v2.o  
  32. CC  libavformat/metadata.o  
  33. CC  libavformat/mux.o  
  34. CC  libavformat/options.o  
  35. CC  libavformat/os_support.o  
  36. CC  libavformat/protocols.o  
  37. CC  libavformat/qtpalette.o  
  38. CC  libavformat/rawdec.o  
  39. CC  libavformat/riff.o  
  40. CC  libavformat/sdp.o  
  41. CC  libavformat/url.o  
  42. CC  libavformat/utils.o  
  43. AR  libavformat/libavformat.a  
  44. CC  libavcodec/allcodecs.o  
  45. CC  libavcodec/arm/h264chroma_init_arm.o  
  46. AS  libavcodec/arm/h264cmc_neon.o  
  47. CC  libavcodec/arm/h264dsp_init_arm.o  
  48. AS  libavcodec/arm/h264dsp_neon.o  
  49. AS  libavcodec/arm/h264idct_neon.o  
  50. CC  libavcodec/arm/h264pred_init_arm.o  
  51. AS  libavcodec/arm/h264pred_neon.o  
  52. CC  libavcodec/arm/h264qpel_init_arm.o  
  53. AS  libavcodec/arm/h264qpel_neon.o  
  54. AS  libavcodec/arm/hpeldsp_neon.o  
  55. AS  libavcodec/arm/idctdsp_arm.o  
  56. AS  libavcodec/arm/idctdsp_armv6.o  
  57. CC  libavcodec/arm/idctdsp_init_arm.o  
  58. CC  libavcodec/arm/idctdsp_init_armv5te.o  
  59. CC  libavcodec/arm/idctdsp_init_armv6.o  
  60. CC  libavcodec/arm/idctdsp_init_neon.o  
  61. AS  libavcodec/arm/idctdsp_neon.o  
  62. AS  libavcodec/arm/jrevdct_arm.o  
  63. AS  libavcodec/arm/me_cmp_armv6.o  
  64. CC  libavcodec/arm/me_cmp_init_arm.o  
  65. AS  libavcodec/arm/pixblockdsp_armv6.o  
  66. CC  libavcodec/arm/pixblockdsp_init_arm.o  
  67. AS  libavcodec/arm/simple_idct_arm.o  
  68. AS  libavcodec/arm/simple_idct_armv5te.o  
  69. AS  libavcodec/arm/simple_idct_armv6.o  
  70. AS  libavcodec/arm/simple_idct_neon.o  
  71. AS  libavcodec/arm/startcode_armv6.o  
  72. AS  libavcodec/arm/videodsp_armv5te.o  
  73. CC  libavcodec/arm/videodsp_init_arm.o  
  74. CC  libavcodec/arm/videodsp_init_armv5te.o  
  75. CC  libavcodec/audioconvert.o  
  76. CC  libavcodec/avdct.o  
  77. CC  libavcodec/avpacket.o  
  78. CC  libavcodec/avpicture.o  
  79. CC  libavcodec/bitstream.o  
  80. CC  libavcodec/bitstream_filter.o  
  81. CC  libavcodec/bitstream_filters.o  
  82. CC  libavcodec/bsf.o  
  83. CC  libavcodec/cabac.o  
  84. CC  libavcodec/codec_desc.o  
  85. CC  libavcodec/d3d11va.o  
  86. CC  libavcodec/dirac.o  
  87. CC  libavcodec/dv_profile.o  
  88. CC  libavcodec/error_resilience.o  
  89. CC  libavcodec/faandct.o  
  90. CC  libavcodec/faanidct.o  
  91. CC  libavcodec/fdctdsp.o  
  92. CC  libavcodec/golomb.o  
  93. CC  libavcodec/h2645_parse.o  
  94. CC  libavcodec/h264_cabac.o  
  95. CC  libavcodec/h264_cavlc.o  
  96. CC  libavcodec/h264_direct.o  
  97. CC  libavcodec/h264_loopfilter.o  
  98. CC  libavcodec/h264_mb.o  
  99. CC  libavcodec/h264_parse.o  
  100. CC  libavcodec/h264_parser.o  
  101. CC  libavcodec/h264_picture.o  
  102. CC  libavcodec/h264_ps.o  
  103. CC  libavcodec/h264_refs.o  
  104. CC  libavcodec/h264_sei.o  
  105. CC  libavcodec/h264_slice.o  
  106. CC  libavcodec/h264chroma.o  
  107. CC  libavcodec/h264data.o  
  108. CC  libavcodec/h264dec.o  
  109. CC  libavcodec/h264dsp.o  
  110. CC  libavcodec/h264idct.o  
  111. CC  libavcodec/h264pred.o  
  112. CC  libavcodec/h264qpel.o  
  113. CC  libavcodec/idctdsp.o  
  114. CC  libavcodec/imgconvert.o  
  115. CC  libavcodec/jfdctfst.o  
  116. CC  libavcodec/jfdctint.o  
  117. CC  libavcodec/jni.o  
  118. CC  libavcodec/jrevdct.o  
  119. CC  libavcodec/mathtables.o  
  120. CC  libavcodec/me_cmp.o  
  121. CC  libavcodec/mediacodec.o  
  122. CC  libavcodec/options.o  
  123. CC  libavcodec/parser.o  
  124. CC  libavcodec/pixblockdsp.o  
  125. CC  libavcodec/profiles.o  
  126. CC  libavcodec/pthread.o  
  127. CC  libavcodec/pthread_frame.o  
  128. CC  libavcodec/pthread_slice.o  
  129. CC  libavcodec/qsv_api.o  
  130. CC  libavcodec/raw.o  
  131. CC  libavcodec/resample.o  
  132. CC  libavcodec/resample2.o  
  133. CC  libavcodec/simple_idct.o  
  134. CC  libavcodec/startcode.o  
  135. CC  libavcodec/utils.o  
  136. CC  libavcodec/videodsp.o  
  137. CC  libavcodec/vorbis_parser.o  
  138. CC  libavcodec/xiph.o  
  139. AR  libavcodec/libavcodec.a  
  140. CC  libswresample/arm/audio_convert_init.o  
  141. AS  libswresample/arm/audio_convert_neon.o  
  142. AS  libswresample/arm/resample.o  
  143. CC  libswresample/arm/resample_init.o  
  144. CC  libswresample/audioconvert.o  
  145. CC  libswresample/dither.o  
  146. CC  libswresample/options.o  
  147. CC  libswresample/rematrix.o  
  148. CC  libswresample/resample.o  
  149. CC  libswresample/resample_dsp.o  
  150. CC  libswresample/swresample.o  
  151. CC  libswresample/swresample_frame.o  
  152. AR  libswresample/libswresample.a  
  153. CC  libswscale/alphablend.o  
  154. AS  libswscale/arm/hscale.o  
  155. AS  libswscale/arm/output.o  
  156. AS  libswscale/arm/rgb2yuv_neon_16.o  
  157. AS  libswscale/arm/rgb2yuv_neon_32.o  
  158. CC  libswscale/arm/swscale.o  
  159. CC  libswscale/arm/swscale_unscaled.o  
  160. AS  libswscale/arm/yuv2rgb_neon.o  
  161. CC  libswscale/gamma.o  
  162. CC  libswscale/hscale.o  
  163. CC  libswscale/hscale_fast_bilinear.o  
  164. CC  libswscale/input.o  
  165. CC  libswscale/options.o  
  166. CC  libswscale/output.o  
  167. CC  libswscale/rgb2rgb.o  
  168. CC  libswscale/slice.o  
  169. CC  libswscale/swscale.o  
  170. CC  libswscale/swscale_unscaled.o  
  171. CC  libswscale/utils.o  
  172. CC  libswscale/vscale.o  
  173. CC  libswscale/yuv2rgb.o  
  174. AR  libswscale/libswscale.a  
  175. CC  libavutil/../compat/strtod.o  
  176. CC  libavutil/adler32.o  
  177. CC  libavutil/aes.o  
  178. CC  libavutil/aes_ctr.o  
  179. CC  libavutil/arm/cpu.o  
  180. CC  libavutil/arm/float_dsp_init_arm.o  
  181. CC  libavutil/arm/float_dsp_init_neon.o  
  182. CC  libavutil/arm/float_dsp_init_vfp.o  
  183. AS  libavutil/arm/float_dsp_neon.o  
  184. AS  libavutil/arm/float_dsp_vfp.o  
  185. CC  libavutil/audio_fifo.o  
  186. CC  libavutil/avstring.o  
  187. CC  libavutil/base64.o  
  188. CC  libavutil/blowfish.o  
  189. CC  libavutil/bprint.o  
  190. CC  libavutil/buffer.o  
  191. CC  libavutil/camellia.o  
  192. CC  libavutil/cast5.o  
  193. CC  libavutil/channel_layout.o  
  194. CC  libavutil/color_utils.o  
  195. CC  libavutil/cpu.o  
  196. CC  libavutil/crc.o  
  197. CC  libavutil/des.o  
  198. CC  libavutil/dict.o  
  199. CC  libavutil/display.o  
  200. CC  libavutil/downmix_info.o  
  201. CC  libavutil/error.o  
  202. CC  libavutil/eval.o  
  203. CC  libavutil/fifo.o  
  204. CC  libavutil/file.o  
  205. CC  libavutil/file_open.o  
  206. CC  libavutil/fixed_dsp.o  
  207. CC  libavutil/float_dsp.o  
  208. CC  libavutil/frame.o  
  209. CC  libavutil/hash.o  
  210. CC  libavutil/hmac.o  
  211. CC  libavutil/hwcontext.o  
  212. CC  libavutil/imgutils.o  
  213. CC  libavutil/integer.o  
  214. CC  libavutil/intmath.o  
  215. CC  libavutil/lfg.o  
  216. CC  libavutil/lls.o  
  217. CC  libavutil/log.o  
  218. CC  libavutil/log2_tab.o  
  219. CC  libavutil/mastering_display_metadata.o  
  220. CC  libavutil/mathematics.o  
  221. CC  libavutil/md5.o  
  222. CC  libavutil/mem.o  
  223. CC  libavutil/murmur3.o  
  224. CC  libavutil/opt.o  
  225. CC  libavutil/parseutils.o  
  226. CC  libavutil/pixdesc.o  
  227. CC  libavutil/pixelutils.o  
  228. CC  libavutil/random_seed.o  
  229. CC  libavutil/rational.o  
  230. CC  libavutil/rc4.o  
  231. CC  libavutil/reverse.o  
  232. CC  libavutil/ripemd.o  
  233. CC  libavutil/samplefmt.o  
  234. CC  libavutil/sha.o  
  235. CC  libavutil/sha512.o  
  236. CC  libavutil/stereo3d.o  
  237. CC  libavutil/tea.o  
  238. CC  libavutil/threadmessage.o  
  239. CC  libavutil/time.o  
  240. CC  libavutil/timecode.o  
  241. CC  libavutil/tree.o  
  242. CC  libavutil/twofish.o  
  243. CC  libavutil/utils.o  
  244. CC  libavutil/xga_font_data.o  
  245. CC  libavutil/xtea.o  
  246. AR  libavutil/libavutil.a  

(b)

图1.2. FFmpeg中make编译

[plain] view plain copy
  1. cmake_minimum_required(VERSION 3.4.1)  
  2. include_directories(../../../../../../../libavcodec  
  3.                      ../../../../../../../libavdevice  
  4.                      ../../../../../../../libavfilter  
  5.                      ../../../../../../../libavformat  
  6.                      ../../../../../../../libavresample  
  7.                      ../../../../../../../libavutil  
  8.                      ../../../../../../../libpostproc  
  9.                      ../../../../../../../libswresample  
  10.                      ../../../../../../../libswscale  
  11.                      ../../../../../../../)  
  12. set(libfilenames  
  13.                     ../../../../../../../libavcodec/allcodecs.c  
  14.                     ../../../../../../../libavcodec/arm/h264chroma_init_arm.c  
  15.                     ../../../../../../../libavcodec/arm/h264dsp_init_arm.c  
  16.                     ../../../../../../../libavcodec/arm/h264pred_init_arm.c  
  17.                     ../../../../../../../libavcodec/arm/h264qpel_init_arm.c  
  18.                     ../../../../../../../libavcodec/arm/idctdsp_init_arm.c  
  19.                     ../../../../../../../libavcodec/arm/idctdsp_init_armv5te.c  
  20.                     ../../../../../../../libavcodec/arm/idctdsp_init_armv6.c  
  21.                     ../../../../../../../libavcodec/arm/idctdsp_init_neon.c  
  22.                     ../../../../../../../libavcodec/arm/me_cmp_init_arm.c  
  23.                     ../../../../../../../libavcodec/arm/pixblockdsp_init_arm.c  
  24.                     ../../../../../../../libavcodec/arm/videodsp_init_arm.c  
  25.                     ../../../../../../../libavcodec/arm/videodsp_init_armv5te.c  
  26.                     ../../../../../../../libavcodec/audioconvert.c  
  27.                     ../../../../../../../libavcodec/avdct.c  
  28.                     ../../../../../../../libavcodec/avpacket.c  
  29.                     ../../../../../../../libavcodec/avpicture.c  
  30.                     ../../../../../../../libavcodec/bitstream.c  
  31.                     ../../../../../../../libavcodec/bitstream_filter.c  
  32.                     ../../../../../../../libavcodec/bitstream_filters.c  
  33.                     ../../../../../../../libavcodec/bsf.c  
  34.                     ../../../../../../../libavcodec/cabac.c  
  35.                     ../../../../../../../libavcodec/codec_desc.c  
  36.                     ../../../../../../../libavcodec/d3d11va.c  
  37.                     ../../../../../../../libavcodec/dirac.c  
  38.                     ../../../../../../../libavcodec/dv_profile.c  
  39.                     ../../../../../../../libavcodec/error_resilience.c  
  40.                     ../../../../../../../libavcodec/faandct.c  
  41.                     ../../../../../../../libavcodec/faanidct.c  
  42.                     ../../../../../../../libavcodec/fdctdsp.c  
  43.                     ../../../../../../../libavcodec/golomb.c  
  44.                     ../../../../../../../libavcodec/h2645_parse.c  
  45.                     ../../../../../../../libavcodec/h264_cabac.c  
  46.                     ../../../../../../../libavcodec/h264_cavlc.c  
  47.                     ../../../../../../../libavcodec/h264_direct.c  
  48.                     ../../../../../../../libavcodec/h264_loopfilter.c  
  49.                     ../../../../../../../libavcodec/h264_mb.c  
  50.                     ../../../../../../../libavcodec/h264_parse.c  
  51.                     ../../../../../../../libavcodec/h264_parser.c  
  52.                     ../../../../../../../libavcodec/h264_picture.c  
  53.                     ../../../../../../../libavcodec/h264_ps.c  
  54.                     ../../../../../../../libavcodec/h264_refs.c  
  55.                     ../../../../../../../libavcodec/h264_sei.c  
  56.                     ../../../../../../../libavcodec/h264_slice.c  
  57.                     ../../../../../../../libavcodec/h264chroma.c  
  58.                     ../../../../../../../libavcodec/h264data.c  
  59.                     ../../../../../../../libavcodec/h264dec.c  
  60.                     ../../../../../../../libavcodec/h264dsp.c  
  61.                     ../../../../../../../libavcodec/h264idct.c  
  62.                     ../../../../../../../libavcodec/h264pred.c  
  63.                     ../../../../../../../libavcodec/h264qpel.c  
  64.                     ../../../../../../../libavcodec/idctdsp.c  
  65.                     ../../../../../../../libavcodec/imgconvert.c  
  66.                     ../../../../../../../libavcodec/jfdctfst.c  
  67.                     ../../../../../../../libavcodec/jfdctint.c  
  68.                     ../../../../../../../libavcodec/jni.c  
  69.                     ../../../../../../../libavcodec/jrevdct.c  
  70.                     ../../../../../../../libavcodec/mathtables.c  
  71.                     ../../../../../../../libavcodec/me_cmp.c  
  72.                     ../../../../../../../libavcodec/mediacodec.c  
  73.                     ../../../../../../../libavcodec/options.c  
  74.                     ../../../../../../../libavcodec/parser.c  
  75.                     ../../../../../../../libavcodec/pixblockdsp.c  
  76.                     ../../../../../../../libavcodec/profiles.c  
  77.                     ../../../../../../../libavcodec/pthread.c  
  78.                     ../../../../../../../libavcodec/pthread_frame.c  
  79.                     ../../../../../../../libavcodec/pthread_slice.c  
  80.                     ../../../../../../../libavcodec/qsv_api.c  
  81.                     ../../../../../../../libavcodec/raw.c  
  82.                     ../../../../../../../libavcodec/resample.c  
  83.                     ../../../../../../../libavcodec/resample2.c  
  84.                     ../../../../../../../libavcodec/simple_idct.c  
  85.                     ../../../../../../../libavcodec/startcode.c  
  86.                     ../../../../../../../libavcodec/utils.c  
  87.                     ../../../../../../../libavcodec/videodsp.c  
  88.                     ../../../../../../../libavcodec/vorbis_parser.c  
  89.                     ../../../../../../../libavcodec/xiph.c  
  90.                     ../../../../../../../libavcodec/arm/h264cmc_neon.S  
  91.                     ../../../../../../../libavcodec/arm/h264dsp_neon.S  
  92.                     ../../../../../../../libavcodec/arm/h264idct_neon.S  
  93.                     ../../../../../../../libavcodec/arm/h264pred_neon.S  
  94.                     ../../../../../../../libavcodec/arm/h264qpel_neon.S  
  95.                     ../../../../../../../libavcodec/arm/hpeldsp_neon.S  
  96.                     ../../../../../../../libavcodec/arm/idctdsp_arm.S  
  97.                     ../../../../../../../libavcodec/arm/idctdsp_armv6.S  
  98.                     ../../../../../../../libavcodec/arm/idctdsp_neon.S  
  99.                     ../../../../../../../libavcodec/arm/jrevdct_arm.S  
  100.                     ../../../../../../../libavcodec/arm/me_cmp_armv6.S  
  101.                     ../../../../../../../libavcodec/arm/pixblockdsp_armv6.S  
  102.                     ../../../../../../../libavcodec/arm/simple_idct_arm.S  
  103.                     ../../../../../../../libavcodec/arm/simple_idct_armv5te.S  
  104.                     ../../../../../../../libavcodec/arm/simple_idct_armv6.S  
  105.                     ../../../../../../../libavcodec/arm/simple_idct_neon.S  
  106.                     ../../../../../../../libavcodec/arm/startcode_armv6.S  
  107.                     ../../../../../../../libavcodec/arm/videodsp_armv5te.S  
  108.                     ../../../../../../../libavdevice/alldevices.c  
  109.                     ../../../../../../../libavdevice/avdevice.c  
  110.                     ../../../../../../../libavdevice/utils.c  
  111.                     ../../../../../../../libavfilter/allfilters.c  
  112.                     ../../../../../../../libavfilter/audio.c  
  113.                     ../../../../../../../libavfilter/avfilter.c  
  114.                     ../../../../../../../libavfilter/avfiltergraph.c  
  115.                     ../../../../../../../libavfilter/buffersink.c  
  116.                     ../../../../../../../libavfilter/buffersrc.c  
  117.                     ../../../../../../../libavfilter/drawutils.c  
  118.                     ../../../../../../../libavfilter/fifo.c  
  119.                     ../../../../../../../libavfilter/formats.c  
  120.                     ../../../../../../../libavfilter/framepool.c  
  121.                     ../../../../../../../libavfilter/graphdump.c  
  122.                     ../../../../../../../libavfilter/graphparser.c  
  123.                     ../../../../../../../libavfilter/opencl_allkernels.c  
  124.                     ../../../../../../../libavfilter/pthread.c  
  125.                     ../../../../../../../libavfilter/transform.c  
  126.                     ../../../../../../../libavfilter/video.c  
  127.                     ../../../../../../../libavformat/allformats.c  
  128.                     ../../../../../../../libavformat/avio.c  
  129.                     ../../../../../../../libavformat/aviobuf.c  
  130.                     ../../../../../../../libavformat/cutils.c  
  131.                     ../../../../../../../libavformat/dump.c  
  132.                     ../../../../../../../libavformat/file.c  
  133.                     ../../../../../../../libavformat/format.c  
  134.                     ../../../../../../../libavformat/h264dec.c  
  135.                     ../../../../../../../libavformat/id3v1.c  
  136.                     ../../../../../../../libavformat/id3v2.c  
  137.                     ../../../../../../../libavformat/metadata.c  
  138.                     ../../../../../../../libavformat/mux.c  
  139.                     ../../../../../../../libavformat/options.c  
  140.                     ../../../../../../../libavformat/os_support.c  
  141.                     ../../../../../../../libavformat/protocols.c  
  142.                     ../../../../../../../libavformat/qtpalette.c  
  143.                     ../../../../../../../libavformat/rawdec.c  
  144.                     ../../../../../../../libavformat/riff.c  
  145.                     ../../../../../../../libavformat/sdp.c  
  146.                     ../../../../../../../libavformat/url.c  
  147.                     ../../../../../../../libavformat/utils.c  
  148.                     ../../../../../../../libswresample/arm/audio_convert_init.c  
  149.                     ../../../../../../../libswresample/arm/resample_init.c  
  150.                     ../../../../../../../libswresample/audioconvert.c  
  151.                     ../../../../../../../libswresample/dither.c  
  152.                     ../../../../../../../libswresample/options.c  
  153.                     ../../../../../../../libswresample/rematrix.c  
  154.                     ../../../../../../../libswresample/resample.c  
  155.                     ../../../../../../../libswresample/resample_dsp.c  
  156.                     ../../../../../../../libswresample/swresample.c  
  157.                     ../../../../../../../libswresample/swresample_frame.c  
  158.                     ../../../../../../../libswscale/alphablend.c  
  159.                     ../../../../../../../libswscale/arm/swscale.c  
  160.                     ../../../../../../../libswscale/arm/swscale_unscaled.c  
  161.                     ../../../../../../../libswscale/gamma.c  
  162.                     ../../../../../../../libswscale/hscale.c  
  163.                     ../../../../../../../libswscale/hscale_fast_bilinear.c  
  164.                     ../../../../../../../libswscale/input.c  
  165.                     ../../../../../../../libswscale/options.c  
  166.                     ../../../../../../../libswscale/output.c  
  167.                     ../../../../../../../libswscale/rgb2rgb.c  
  168.                     ../../../../../../../libswscale/slice.c  
  169.                     ../../../../../../../libswscale/swscale.c  
  170.                     ../../../../../../../libswscale/swscale_unscaled.c  
  171.                     ../../../../../../../libswscale/utils.c  
  172.                     ../../../../../../../libswscale/vscale.c  
  173.                     ../../../../../../../libswscale/yuv2rgb.c  
  174.                     ../../../../../../../libavutil/../compat/strtod.c  
  175.                     ../../../../../../../libavutil/adler32.c  
  176.                     ../../../../../../../libavutil/aes.c  
  177.                     ../../../../../../../libavutil/aes_ctr.c  
  178.                     ../../../../../../../libavutil/arm/cpu.c  
  179.                     ../../../../../../../libavutil/arm/float_dsp_init_arm.c  
  180.                     ../../../../../../../libavutil/arm/float_dsp_init_neon.c  
  181.                     ../../../../../../../libavutil/arm/float_dsp_init_vfp.c  
  182.                     ../../../../../../../libavutil/audio_fifo.c  
  183.                     ../../../../../../../libavutil/avstring.c  
  184.                     ../../../../../../../libavutil/base64.c  
  185.                     ../../../../../../../libavutil/blowfish.c  
  186.                     ../../../../../../../libavutil/bprint.c  
  187.                     ../../../../../../../libavutil/buffer.c  
  188.                     ../../../../../../../libavutil/camellia.c  
  189.                     ../../../../../../../libavutil/cast5.c  
  190.                     ../../../../../../../libavutil/channel_layout.c  
  191.                     ../../../../../../../libavutil/color_utils.c  
  192.                     ../../../../../../../libavutil/cpu.c  
  193.                     ../../../../../../../libavutil/crc.c  
  194.                     ../../../../../../../libavutil/des.c  
  195.                     ../../../../../../../libavutil/dict.c  
  196.                     ../../../../../../../libavutil/display.c  
  197.                     ../../../../../../../libavutil/downmix_info.c  
  198.                     ../../../../../../../libavutil/error.c  
  199.                     ../../../../../../../libavutil/eval.c  
  200.                     ../../../../../../../libavutil/fifo.c  
  201.                     ../../../../../../../libavutil/file.c  
  202.                     ../../../../../../../libavutil/file_open.c  
  203.                     ../../../../../../../libavutil/fixed_dsp.c  
  204.                     ../../../../../../../libavutil/float_dsp.c  
  205.                     ../../../../../../../libavutil/frame.c  
  206.                     ../../../../../../../libavutil/hash.c  
  207.                     ../../../../../../../libavutil/hmac.c  
  208.                     ../../../../../../../libavutil/hwcontext.c  
  209.                     ../../../../../../../libavutil/imgutils.c  
  210.                     ../../../../../../../libavutil/integer.c  
  211.                     ../../../../../../../libavutil/intmath.c  
  212.                     ../../../../../../../libavutil/lfg.c  
  213.                     ../../../../../../../libavutil/lls.c  
  214.                     ../../../../../../../libavutil/log.c  
  215.                     ../../../../../../../libavutil/log2_tab.c  
  216.                     ../../../../../../../libavutil/mastering_display_metadata.c  
  217.                     ../../../../../../../libavutil/mathematics.c  
  218.                     ../../../../../../../libavutil/md5.c  
  219.                     ../../../../../../../libavutil/mem.c  
  220.                     ../../../../../../../libavutil/murmur3.c  
  221.                     ../../../../../../../libavutil/opt.c  
  222.                     ../../../../../../../libavutil/parseutils.c  
  223.                     ../../../../../../../libavutil/pixdesc.c  
  224.                     ../../../../../../../libavutil/pixelutils.c  
  225.                     ../../../../../../../libavutil/random_seed.c  
  226.                     ../../../../../../../libavutil/rational.c  
  227.                     ../../../../../../../libavutil/rc4.c  
  228.                     ../../../../../../../libavutil/reverse.c  
  229.                     ../../../../../../../libavutil/ripemd.c  
  230.                     ../../../../../../../libavutil/samplefmt.c  
  231.                     ../../../../../../../libavutil/sha.c  
  232.                     ../../../../../../../libavutil/sha512.c  
  233.                     ../../../../../../../libavutil/stereo3d.c  
  234.                     ../../../../../../../libavutil/tea.c  
  235.                     ../../../../../../../libavutil/threadmessage.c  
  236.                     ../../../../../../../libavutil/time.c  
  237.                     ../../../../../../../libavutil/timecode.c  
  238.                     ../../../../../../../libavutil/tree.c  
  239.                     ../../../../../../../libavutil/twofish.c  
  240.                     ../../../../../../../libavutil/utils.c  
  241.                     ../../../../../../../libavutil/xga_font_data.c  
  242.                     ../../../../../../../libavutil/xtea.c  
  243.                     ../../../../../../../libswresample/arm/audio_convert_neon.S  
  244.                     ../../../../../../../libswresample/arm/resample.S  
  245.                     ../../../../../../../libswscale/arm/hscale.S  
  246.                     ../../../../../../../libswscale/arm/output.S  
  247.                     ../../../../../../../libswscale/arm/rgb2yuv_neon_16.S  
  248.                     ../../../../../../../libswscale/arm/rgb2yuv_neon_32.S  
  249.                     ../../../../../../../libswscale/arm/yuv2rgb_neon.S  
  250.                     ../../../../../../../libavutil/arm/float_dsp_neon.S  
  251.                     ../../../../../../../libavutil/arm/float_dsp_vfp.S  
  252. )  
  253.   
  254. list(APPEND libfilenames  
  255.             ../cpp/wrapper/getopt.c  
  256.             ../cpp/wrapper/main.c  
  257.             ../cpp/wrapper/openHevcWrapper.c  
  258. )  
  259. #message(STATUS "libfilenames source: " ${libfilenames})  
  260. enable_language(ASM)  
  261. add_library( # Sets the name of the library.  
  262.              ffmpegH264-lib  
  263.   
  264.              # Sets the library as a shared library.  
  265.              STATIC  
  266.   
  267.              # Provides a relative path to your source file(s).  
  268.              ${libfilenames})  

图1.3. CMakeList.txt文件

2.  修改配置文件和源文件

经过第一部分的操作,已经生成了一个Android Studio工程,并且使用了CMake的方式来编译ffmpeg库。但是ffmpeg库在编译过程中仍然会出现许多错误,主要原因是未包含对应头文件或者头文件冲突等。下面列举个别作为例子。

1)       第一种情况是缺少头文件引用,只要添加对应的头文件即可,如图2.1所示。通过搜索,可以发现“ff_reverse”是一个定义在“libavutil/internal.h”中的一个extern变量,通过在“bitstream.c”文件的开头引入头文件“libavutil/internal.h”即可解决,相似缺少引用“config.h”头文件和“cpu.h”,按照相同的方法处理即可;

图2.1缺乏对应头文件引用

2)       第二种情况如图2.2所示,原因是libavutil/time.h和NDK自带的time.h头文件造成了冲突,把 libavutil/time.h更名为libavutil/avtime.h, 同时修改下面文件中的引用libavutil/time.h为libavutil/avtime.h :libavformat/avio.c、libavformat/hls.c、libavformat/avformat.h、libavformat/mux.c、 libavformat/utils.c、libavutil/time.c、libavutil/eval.c、libavutil/parseutils.c

图2.2 config.h中没有对应的宏

       以上只是粗略大概的讲述了两种不同的情况的处理方法,并未对每个文件的修改做详细说明;由于NDK版本不同,可能还会出现不同的错误应根据实际情况酌情处理,比如“av_restrict”关键字等。

3.  调试FFmpeg的H264工程

该项目的的制作过程中利用了网上OpenHEVC工程的部分代码,已将里面的部分代码改成了调用H264解码库,如图3所示。FFmpeg H264的Android Studio工程,可以点此下载,工程中已经包含了H264的Neon优化代码。

图3 Android Studio调试FFmpeg H264解码库

原创粉丝点击