1. 程式人生 > >FFmpeg解碼庫裁剪和除錯三--Android Studio除錯FFmpeg

FFmpeg解碼庫裁剪和除錯三--Android Studio除錯FFmpeg

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的組合語言支援功能。

#!/bin/bash
export TEMPDIR="D:/tmp"
export NDKROOT="D:/Android/sdk/ndk-bundle"
PREBUILT=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
SYSROOT=$NDKROOT/platforms/android-9/arch-arm
./configure --target-os=linux \
			--arch=arm \
			--cpu=armv7-a \
			--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
			--sysroot=$SYSROOT \
			--disable-ffmpeg \
			--disable-ffplay \
			--disable-ffserver \
			--disable-ffprobe \
			--enable-neon \
			--disable-everything \
			--enable-decoder=h264 \
			--enable-parser=h264 \
			--enable-demuxer=h264 \
			--enable-protocol=file
(a)

(b)                                                          (c)


(d)

圖1.1. FFmpeg中configure配置

(a)

CC	libavdevice/alldevices.o
CC	libavdevice/avdevice.o
CC	libavdevice/utils.o
AR	libavdevice/libavdevice.a
CC	libavfilter/allfilters.o
CC	libavfilter/audio.o
CC	libavfilter/avfilter.o
CC	libavfilter/avfiltergraph.o
CC	libavfilter/buffersink.o
CC	libavfilter/buffersrc.o
CC	libavfilter/drawutils.o
CC	libavfilter/fifo.o
CC	libavfilter/formats.o
CC	libavfilter/framepool.o
CC	libavfilter/graphdump.o
CC	libavfilter/graphparser.o
CC	libavfilter/opencl_allkernels.o
CC	libavfilter/pthread.o
CC	libavfilter/transform.o
CC	libavfilter/video.o
AR	libavfilter/libavfilter.a
CC	libavformat/allformats.o
CC	libavformat/avio.o
CC	libavformat/aviobuf.o
CC	libavformat/cutils.o
CC	libavformat/dump.o
CC	libavformat/file.o
CC	libavformat/format.o
CC	libavformat/h264dec.o
CC	libavformat/id3v1.o
CC	libavformat/id3v2.o
CC	libavformat/metadata.o
CC	libavformat/mux.o
CC	libavformat/options.o
CC	libavformat/os_support.o
CC	libavformat/protocols.o
CC	libavformat/qtpalette.o
CC	libavformat/rawdec.o
CC	libavformat/riff.o
CC	libavformat/sdp.o
CC	libavformat/url.o
CC	libavformat/utils.o
AR	libavformat/libavformat.a
CC	libavcodec/allcodecs.o
CC	libavcodec/arm/h264chroma_init_arm.o
AS	libavcodec/arm/h264cmc_neon.o
CC	libavcodec/arm/h264dsp_init_arm.o
AS	libavcodec/arm/h264dsp_neon.o
AS	libavcodec/arm/h264idct_neon.o
CC	libavcodec/arm/h264pred_init_arm.o
AS	libavcodec/arm/h264pred_neon.o
CC	libavcodec/arm/h264qpel_init_arm.o
AS	libavcodec/arm/h264qpel_neon.o
AS	libavcodec/arm/hpeldsp_neon.o
AS	libavcodec/arm/idctdsp_arm.o
AS	libavcodec/arm/idctdsp_armv6.o
CC	libavcodec/arm/idctdsp_init_arm.o
CC	libavcodec/arm/idctdsp_init_armv5te.o
CC	libavcodec/arm/idctdsp_init_armv6.o
CC	libavcodec/arm/idctdsp_init_neon.o
AS	libavcodec/arm/idctdsp_neon.o
AS	libavcodec/arm/jrevdct_arm.o
AS	libavcodec/arm/me_cmp_armv6.o
CC	libavcodec/arm/me_cmp_init_arm.o
AS	libavcodec/arm/pixblockdsp_armv6.o
CC	libavcodec/arm/pixblockdsp_init_arm.o
AS	libavcodec/arm/simple_idct_arm.o
AS	libavcodec/arm/simple_idct_armv5te.o
AS	libavcodec/arm/simple_idct_armv6.o
AS	libavcodec/arm/simple_idct_neon.o
AS	libavcodec/arm/startcode_armv6.o
AS	libavcodec/arm/videodsp_armv5te.o
CC	libavcodec/arm/videodsp_init_arm.o
CC	libavcodec/arm/videodsp_init_armv5te.o
CC	libavcodec/audioconvert.o
CC	libavcodec/avdct.o
CC	libavcodec/avpacket.o
CC	libavcodec/avpicture.o
CC	libavcodec/bitstream.o
CC	libavcodec/bitstream_filter.o
CC	libavcodec/bitstream_filters.o
CC	libavcodec/bsf.o
CC	libavcodec/cabac.o
CC	libavcodec/codec_desc.o
CC	libavcodec/d3d11va.o
CC	libavcodec/dirac.o
CC	libavcodec/dv_profile.o
CC	libavcodec/error_resilience.o
CC	libavcodec/faandct.o
CC	libavcodec/faanidct.o
CC	libavcodec/fdctdsp.o
CC	libavcodec/golomb.o
CC	libavcodec/h2645_parse.o
CC	libavcodec/h264_cabac.o
CC	libavcodec/h264_cavlc.o
CC	libavcodec/h264_direct.o
CC	libavcodec/h264_loopfilter.o
CC	libavcodec/h264_mb.o
CC	libavcodec/h264_parse.o
CC	libavcodec/h264_parser.o
CC	libavcodec/h264_picture.o
CC	libavcodec/h264_ps.o
CC	libavcodec/h264_refs.o
CC	libavcodec/h264_sei.o
CC	libavcodec/h264_slice.o
CC	libavcodec/h264chroma.o
CC	libavcodec/h264data.o
CC	libavcodec/h264dec.o
CC	libavcodec/h264dsp.o
CC	libavcodec/h264idct.o
CC	libavcodec/h264pred.o
CC	libavcodec/h264qpel.o
CC	libavcodec/idctdsp.o
CC	libavcodec/imgconvert.o
CC	libavcodec/jfdctfst.o
CC	libavcodec/jfdctint.o
CC	libavcodec/jni.o
CC	libavcodec/jrevdct.o
CC	libavcodec/mathtables.o
CC	libavcodec/me_cmp.o
CC	libavcodec/mediacodec.o
CC	libavcodec/options.o
CC	libavcodec/parser.o
CC	libavcodec/pixblockdsp.o
CC	libavcodec/profiles.o
CC	libavcodec/pthread.o
CC	libavcodec/pthread_frame.o
CC	libavcodec/pthread_slice.o
CC	libavcodec/qsv_api.o
CC	libavcodec/raw.o
CC	libavcodec/resample.o
CC	libavcodec/resample2.o
CC	libavcodec/simple_idct.o
CC	libavcodec/startcode.o
CC	libavcodec/utils.o
CC	libavcodec/videodsp.o
CC	libavcodec/vorbis_parser.o
CC	libavcodec/xiph.o
AR	libavcodec/libavcodec.a
CC	libswresample/arm/audio_convert_init.o
AS	libswresample/arm/audio_convert_neon.o
AS	libswresample/arm/resample.o
CC	libswresample/arm/resample_init.o
CC	libswresample/audioconvert.o
CC	libswresample/dither.o
CC	libswresample/options.o
CC	libswresample/rematrix.o
CC	libswresample/resample.o
CC	libswresample/resample_dsp.o
CC	libswresample/swresample.o
CC	libswresample/swresample_frame.o
AR	libswresample/libswresample.a
CC	libswscale/alphablend.o
AS	libswscale/arm/hscale.o
AS	libswscale/arm/output.o
AS	libswscale/arm/rgb2yuv_neon_16.o
AS	libswscale/arm/rgb2yuv_neon_32.o
CC	libswscale/arm/swscale.o
CC	libswscale/arm/swscale_unscaled.o
AS	libswscale/arm/yuv2rgb_neon.o
CC	libswscale/gamma.o
CC	libswscale/hscale.o
CC	libswscale/hscale_fast_bilinear.o
CC	libswscale/input.o
CC	libswscale/options.o
CC	libswscale/output.o
CC	libswscale/rgb2rgb.o
CC	libswscale/slice.o
CC	libswscale/swscale.o
CC	libswscale/swscale_unscaled.o
CC	libswscale/utils.o
CC	libswscale/vscale.o
CC	libswscale/yuv2rgb.o
AR	libswscale/libswscale.a
CC	libavutil/../compat/strtod.o
CC	libavutil/adler32.o
CC	libavutil/aes.o
CC	libavutil/aes_ctr.o
CC	libavutil/arm/cpu.o
CC	libavutil/arm/float_dsp_init_arm.o
CC	libavutil/arm/float_dsp_init_neon.o
CC	libavutil/arm/float_dsp_init_vfp.o
AS	libavutil/arm/float_dsp_neon.o
AS	libavutil/arm/float_dsp_vfp.o
CC	libavutil/audio_fifo.o
CC	libavutil/avstring.o
CC	libavutil/base64.o
CC	libavutil/blowfish.o
CC	libavutil/bprint.o
CC	libavutil/buffer.o
CC	libavutil/camellia.o
CC	libavutil/cast5.o
CC	libavutil/channel_layout.o
CC	libavutil/color_utils.o
CC	libavutil/cpu.o
CC	libavutil/crc.o
CC	libavutil/des.o
CC	libavutil/dict.o
CC	libavutil/display.o
CC	libavutil/downmix_info.o
CC	libavutil/error.o
CC	libavutil/eval.o
CC	libavutil/fifo.o
CC	libavutil/file.o
CC	libavutil/file_open.o
CC	libavutil/fixed_dsp.o
CC	libavutil/float_dsp.o
CC	libavutil/frame.o
CC	libavutil/hash.o
CC	libavutil/hmac.o
CC	libavutil/hwcontext.o
CC	libavutil/imgutils.o
CC	libavutil/integer.o
CC	libavutil/intmath.o
CC	libavutil/lfg.o
CC	libavutil/lls.o
CC	libavutil/log.o
CC	libavutil/log2_tab.o
CC	libavutil/mastering_display_metadata.o
CC	libavutil/mathematics.o
CC	libavutil/md5.o
CC	libavutil/mem.o
CC	libavutil/murmur3.o
CC	libavutil/opt.o
CC	libavutil/parseutils.o
CC	libavutil/pixdesc.o
CC	libavutil/pixelutils.o
CC	libavutil/random_seed.o
CC	libavutil/rational.o
CC	libavutil/rc4.o
CC	libavutil/reverse.o
CC	libavutil/ripemd.o
CC	libavutil/samplefmt.o
CC	libavutil/sha.o
CC	libavutil/sha512.o
CC	libavutil/stereo3d.o
CC	libavutil/tea.o
CC	libavutil/threadmessage.o
CC	libavutil/time.o
CC	libavutil/timecode.o
CC	libavutil/tree.o
CC	libavutil/twofish.o
CC	libavutil/utils.o
CC	libavutil/xga_font_data.o
CC	libavutil/xtea.o
AR	libavutil/libavutil.a

(b)

圖1.2. FFmpeg中make編譯

cmake_minimum_required(VERSION 3.4.1)
include_directories(../../../../../../../libavcodec
                     ../../../../../../../libavdevice
                     ../../../../../../../libavfilter
                     ../../../../../../../libavformat
                     ../../../../../../../libavresample
                     ../../../../../../../libavutil
                     ../../../../../../../libpostproc
                     ../../../../../../../libswresample
                     ../../../../../../../libswscale
                     ../../../../../../../)
set(libfilenames
					../../../../../../../libavcodec/allcodecs.c
					../../../../../../../libavcodec/arm/h264chroma_init_arm.c
					../../../../../../../libavcodec/arm/h264dsp_init_arm.c
					../../../../../../../libavcodec/arm/h264pred_init_arm.c
					../../../../../../../libavcodec/arm/h264qpel_init_arm.c
					../../../../../../../libavcodec/arm/idctdsp_init_arm.c
					../../../../../../../libavcodec/arm/idctdsp_init_armv5te.c
					../../../../../../../libavcodec/arm/idctdsp_init_armv6.c
					../../../../../../../libavcodec/arm/idctdsp_init_neon.c
					../../../../../../../libavcodec/arm/me_cmp_init_arm.c
					../../../../../../../libavcodec/arm/pixblockdsp_init_arm.c
					../../../../../../../libavcodec/arm/videodsp_init_arm.c
					../../../../../../../libavcodec/arm/videodsp_init_armv5te.c
					../../../../../../../libavcodec/audioconvert.c
					../../../../../../../libavcodec/avdct.c
					../../../../../../../libavcodec/avpacket.c
					../../../../../../../libavcodec/avpicture.c
					../../../../../../../libavcodec/bitstream.c
					../../../../../../../libavcodec/bitstream_filter.c
					../../../../../../../libavcodec/bitstream_filters.c
					../../../../../../../libavcodec/bsf.c
					../../../../../../../libavcodec/cabac.c
					../../../../../../../libavcodec/codec_desc.c
					../../../../../../../libavcodec/d3d11va.c
					../../../../../../../libavcodec/dirac.c
					../../../../../../../libavcodec/dv_profile.c
					../../../../../../../libavcodec/error_resilience.c
					../../../../../../../libavcodec/faandct.c
					../../../../../../../libavcodec/faanidct.c
					../../../../../../../libavcodec/fdctdsp.c
					../../../../../../../libavcodec/golomb.c
					../../../../../../../libavcodec/h2645_parse.c
					../../../../../../../libavcodec/h264_cabac.c
					../../../../../../../libavcodec/h264_cavlc.c
					../../../../../../../libavcodec/h264_direct.c
					../../../../../../../libavcodec/h264_loopfilter.c
					../../../../../../../libavcodec/h264_mb.c
					../../../../../../../libavcodec/h264_parse.c
					../../../../../../../libavcodec/h264_parser.c
					../../../../../../../libavcodec/h264_picture.c
					../../../../../../../libavcodec/h264_ps.c
					../../../../../../../libavcodec/h264_refs.c
					../../../../../../../libavcodec/h264_sei.c
					../../../../../../../libavcodec/h264_slice.c
					../../../../../../../libavcodec/h264chroma.c
					../../../../../../../libavcodec/h264data.c
					../../../../../../../libavcodec/h264dec.c
					../../../../../../../libavcodec/h264dsp.c
					../../../../../../../libavcodec/h264idct.c
					../../../../../../../libavcodec/h264pred.c
					../../../../../../../libavcodec/h264qpel.c
					../../../../../../../libavcodec/idctdsp.c
					../../../../../../../libavcodec/imgconvert.c
					../../../../../../../libavcodec/jfdctfst.c
					../../../../../../../libavcodec/jfdctint.c
					../../../../../../../libavcodec/jni.c
					../../../../../../../libavcodec/jrevdct.c
					../../../../../../../libavcodec/mathtables.c
					../../../../../../../libavcodec/me_cmp.c
					../../../../../../../libavcodec/mediacodec.c
					../../../../../../../libavcodec/options.c
					../../../../../../../libavcodec/parser.c
					../../../../../../../libavcodec/pixblockdsp.c
					../../../../../../../libavcodec/profiles.c
					../../../../../../../libavcodec/pthread.c
					../../../../../../../libavcodec/pthread_frame.c
					../../../../../../../libavcodec/pthread_slice.c
					../../../../../../../libavcodec/qsv_api.c
					../../../../../../../libavcodec/raw.c
					../../../../../../../libavcodec/resample.c
					../../../../../../../libavcodec/resample2.c
					../../../../../../../libavcodec/simple_idct.c
					../../../../../../../libavcodec/startcode.c
					../../../../../../../libavcodec/utils.c
					../../../../../../../libavcodec/videodsp.c
					../../../../../../../libavcodec/vorbis_parser.c
					../../../../../../../libavcodec/xiph.c
					../../../../../../../libavcodec/arm/h264cmc_neon.S
					../../../../../../../libavcodec/arm/h264dsp_neon.S
					../../../../../../../libavcodec/arm/h264idct_neon.S
					../../../../../../../libavcodec/arm/h264pred_neon.S
					../../../../../../../libavcodec/arm/h264qpel_neon.S
					../../../../../../../libavcodec/arm/hpeldsp_neon.S
					../../../../../../../libavcodec/arm/idctdsp_arm.S
					../../../../../../../libavcodec/arm/idctdsp_armv6.S
					../../../../../../../libavcodec/arm/idctdsp_neon.S
					../../../../../../../libavcodec/arm/jrevdct_arm.S
					../../../../../../../libavcodec/arm/me_cmp_armv6.S
					../../../../../../../libavcodec/arm/pixblockdsp_armv6.S
					../../../../../../../libavcodec/arm/simple_idct_arm.S
					../../../../../../../libavcodec/arm/simple_idct_armv5te.S
					../../../../../../../libavcodec/arm/simple_idct_armv6.S
					../../../../../../../libavcodec/arm/simple_idct_neon.S
					../../../../../../../libavcodec/arm/startcode_armv6.S
					../../../../../../../libavcodec/arm/videodsp_armv5te.S
					../../../../../../../libavdevice/alldevices.c
					../../../../../../../libavdevice/avdevice.c
					../../../../../../../libavdevice/utils.c
					../../../../../../../libavfilter/allfilters.c
					../../../../../../../libavfilter/audio.c
					../../../../../../../libavfilter/avfilter.c
					../../../../../../../libavfilter/avfiltergraph.c
					../../../../../../../libavfilter/buffersink.c
					../../../../../../../libavfilter/buffersrc.c
					../../../../../../../libavfilter/drawutils.c
					../../../../../../../libavfilter/fifo.c
					../../../../../../../libavfilter/formats.c
					../../../../../../../libavfilter/framepool.c
					../../../../../../../libavfilter/graphdump.c
					../../../../../../../libavfilter/graphparser.c
					../../../../../../../libavfilter/opencl_allkernels.c
					../../../../../../../libavfilter/pthread.c
					../../../../../../../libavfilter/transform.c
					../../../../../../../libavfilter/video.c
					../../../../../../../libavformat/allformats.c
					../../../../../../../libavformat/avio.c
					../../../../../../../libavformat/aviobuf.c
					../../../../../../../libavformat/cutils.c
					../../../../../../../libavformat/dump.c
					../../../../../../../libavformat/file.c
					../../../../../../../libavformat/format.c
					../../../../../../../libavformat/h264dec.c
					../../../../../../../libavformat/id3v1.c
					../../../../../../../libavformat/id3v2.c
					../../../../../../../libavformat/metadata.c
					../../../../../../../libavformat/mux.c
					../../../../../../../libavformat/options.c
					../../../../../../../libavformat/os_support.c
					../../../../../../../libavformat/protocols.c
					../../../../../../../libavformat/qtpalette.c
					../../../../../../../libavformat/rawdec.c
					../../../../../../../libavformat/riff.c
					../../../../../../../libavformat/sdp.c
					../../../../../../../libavformat/url.c
					../../../../../../../libavformat/utils.c
					../../../../../../../libswresample/arm/audio_convert_init.c
					../../../../../../../libswresample/arm/resample_init.c
					../../../../../../../libswresample/audioconvert.c
					../../../../../../../libswresample/dither.c
					../../../../../../../libswresample/options.c
					../../../../../../../libswresample/rematrix.c
					../../../../../../../libswresample/resample.c
					../../../../../../../libswresample/resample_dsp.c
					../../../../../../../libswresample/swresample.c
					../../../../../../../libswresample/swresample_frame.c
					../../../../../../../libswscale/alphablend.c
					../../../../../../../libswscale/arm/swscale.c
					../../../../../../../libswscale/arm/swscale_unscaled.c
					../../../../../../../libswscale/gamma.c
					../../../../../../../libswscale/hscale.c
					../../../../../../../libswscale/hscale_fast_bilinear.c
					../../../../../../../libswscale/input.c
					../../../../../../../libswscale/options.c
					../../../../../../../libswscale/output.c
					../../../../../../../libswscale/rgb2rgb.c
					../../../../../../../libswscale/slice.c
					../../../../../../../libswscale/swscale.c
					../../../../../../../libswscale/swscale_unscaled.c
					../../../../../../../libswscale/utils.c
					../../../../../../../libswscale/vscale.c
					../../../../../../../libswscale/yuv2rgb.c
					../../../../../../../libavutil/../compat/strtod.c
					../../../../../../../libavutil/adler32.c
					../../../../../../../libavutil/aes.c
					../../../../../../../libavutil/aes_ctr.c
					../../../../../../../libavutil/arm/cpu.c
					../../../../../../../libavutil/arm/float_dsp_init_arm.c
					../../../../../../../libavutil/arm/float_dsp_init_neon.c
					../../../../../../../libavutil/arm/float_dsp_init_vfp.c
					../../../../../../../libavutil/audio_fifo.c
					../../../../../../../libavutil/avstring.c
					../../../../../../../libavutil/base64.c
					../../../../../../../libavutil/blowfish.c
					../../../../../../../libavutil/bprint.c
					../../../../../../../libavutil/buffer.c
					../../../../../../../libavutil/camellia.c
					../../../../../../../libavutil/cast5.c
					../../../../../../../libavutil/channel_layout.c
					../../../../../../../libavutil/color_utils.c
					../../../../../../../libavutil/cpu.c
					../../../../../../../libavutil/crc.c
					../../../../../../../libavutil/des.c
					../../../../../../../libavutil/dict.c
					../../../../../../../libavutil/display.c
					../../../../../../../libavutil/downmix_info.c
					../../../../../../../libavutil/error.c
					../../../../../../../libavutil/eval.c
					../../../../../../../libavutil/fifo.c
					../../../../../../../libavutil/file.c
					../../../../../../../libavutil/file_open.c
					../../../../../../../libavutil/fixed_dsp.c
					../../../../../../../libavutil/float_dsp.c
					../../../../../../../libavutil/frame.c
					../../../../../../../libavutil/hash.c
					../../../../../../../libavutil/hmac.c
					../../../../../../../libavutil/hwcontext.c
					../../../../../../../libavutil/imgutils.c
					../../../../../../../libavutil/integer.c
					../../../../../../../libavutil/intmath.c
					../../../../../../../libavutil/lfg.c
					../../../../../../../libavutil/lls.c
					../../../../../../../libavutil/log.c
					../../../../../../../libavutil/log2_tab.c
					../../../../../../../libavutil/mastering_display_metadata.c
					../../../../../../../libavutil/mathematics.c
					../../../../../../../libavutil/md5.c
					../../../../../../../libavutil/mem.c
					../../../../../../../libavutil/murmur3.c
					../../../../../../../libavutil/opt.c
					../../../../../../../libavutil/parseutils.c
					../../../../../../../libavutil/pixdesc.c
					../../../../../../../libavutil/pixelutils.c
					../../../../../../../libavutil/random_seed.c
					../../../../../../../libavutil/rational.c
					../../../../../../../libavutil/rc4.c
					../../../../../../../libavutil/reverse.c
					../../../../../../../libavutil/ripemd.c
					../../../../../../../libavutil/samplefmt.c
					../../../../../../../libavutil/sha.c
					../../../../../../../libavutil/sha512.c
					../../../../../../../libavutil/stereo3d.c
					../../../../../../../libavutil/tea.c
					../../../../../../../libavutil/threadmessage.c
					../../../../../../../libavutil/time.c
					../../../../../../../libavutil/timecode.c
					../../../../../../../libavutil/tree.c
					../../../../../../../libavutil/twofish.c
					../../../../../../../libavutil/utils.c
					../../../../../../../libavutil/xga_font_data.c
					../../../../../../../libavutil/xtea.c
					../../../../../../../libswresample/arm/audio_convert_neon.S
					../../../../../../../libswresample/arm/resample.S
					../../../../../../../libswscale/arm/hscale.S
					../../../../../../../libswscale/arm/output.S
					../../../../../../../libswscale/arm/rgb2yuv_neon_16.S
					../../../../../../../libswscale/arm/rgb2yuv_neon_32.S
					../../../../../../../libswscale/arm/yuv2rgb_neon.S
					../../../../../../../libavutil/arm/float_dsp_neon.S
					../../../../../../../libavutil/arm/float_dsp_vfp.S
)

list(APPEND libfilenames
            ../cpp/wrapper/getopt.c
            ../cpp/wrapper/main.c
            ../cpp/wrapper/openHevcWrapper.c
)
#message(STATUS "libfilenames source: " ${libfilenames})
enable_language(ASM)
add_library( # Sets the name of the library.
             ffmpegH264-lib

             # Sets the library as a shared library.
             STATIC

             # Provides a relative path to your source file(s).
             ${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解碼庫