FFmpeg解码库裁剪和调试三 | 您所在的位置:网站首页 › RC4编码器APK › 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的汇编语言支持功能。 [plain] view plain copy #!/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) [plain] view plain copy 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编译 [plain] view plain copy 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解码库 |
CopyRight 2018-2019 实验室设备网 版权所有 |