一般情况下在AndroID平台使用FFmpeg为动态库或静态库的形式,只能通过设置FFmpeg日志回调来看一些FFmpeg输出的日志,有时需要deBUG来查看FFmpeg内部执行过程,本文记录一下在AndroID Studio中使用FFmpeg源码进行断点调试的方法。需在linux或macOS下,windows 10系统可以使用wsl子系统。
1. 编写FFmpeg配置脚本在此之前需要准备FFmpeg源码
,NDK(AndroID SDK文件夹下的ndk-bundle或者ndk下的特定版本,wsl子系统需要单独下载)linux版)。
用来调试的工程开启尽量少的功能,下面以调试FFmpeg(4.3.1)硬解h264为例,在FFmpeg根目录下新建文件armv8a_config.sh
#!/bin/bashAPI=21NDK=/home/user/AndroID/ndk/androID-ndk-r21PREBUILT=$NDK/toolchains/llvm/prebuilt/linux-x86_64PREFIX=/home/user/Desktop/ffmpeg/arm64-v8aCONfigURE_FLAGS="--disable-programs \--disable-avdevice \--disable-swresample \--disable-swscale \--disable-postproc \--disable-avfilter \--disable-network \--disable-everything \--enable-jni \--enable-mediacodec \--enable-decoder=h264_mediacodec \--enable-decoder=hevc_mediacodec \--enable-demuxer=h264 \--enable-demuxer=mov \--enable-protocol=file"./configure $CONfigURE_FLAGS \--target-os=androID \--arch=aarch64 \--enable-cross-compile \--cross-prefix=$PREBUILT/bin/aarch64-linux-androID- \--prefix=$PREFIX \--cc=$PREBUILT/bin/aarch64-linux-androID$API-clang \--cxx=$PREBUILT/bin/aarch64-linux-androID$API-clang++
在终端中进入FFmpeg根目录,增加执行权限 chmod +x armv8a_config.sh
,并执行./armv8a_config.sh
。
执行完上面步骤ffmpeg会自动配置好Makefile,然后执行make -j8 > sources.txt
,此步骤主要用来获取所有需要的源文件(如果有更好的办法获取源文件列表,可以在评论区告诉我)。
在FFmpeg根目录创建CMakeLists.txt文件,复制上步生成的sources.txt文件中的.o
后缀的所有行,并改后缀为.c
,部分文件为.S
,创建ffmpeg依赖库
project(ffmpeg)set(ffmpeg_sources 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/isom.c libavformat/Metadata.c libavformat/mov.c libavformat/mov_chan.c libavformat/mov_esds.c libavformat/mux.c libavformat/options.c libavformat/os_support.c libavformat/protocols.c libavformat/qtpalette.c libavformat/rawdec.c libavformat/replaygain.c libavformat/riff.c libavformat/riffdec.c libavformat/sdp.c libavformat/url.c libavformat/utils.c libavcodec/aarch64/h264dsp_init_aarch64.c libavcodec/aarch64/h264dsp_neon.S libavcodec/aarch64/h264IDct_neon.S libavcodec/aarch64/IDctdsp_init_aarch64.c libavcodec/aarch64/simple_IDct_neon.S libavcodec/ac3_parser.c libavcodec/ac3tab.c libavcodec/adts_parser.c libavcodec/allcodecs.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/codec_desc.c libavcodec/d3d11va.c libavcodec/decode.c libavcodec/dirac.c libavcodec/dv_profile.c libavcodec/encode.c libavcodec/faandct.c libavcodec/faanIDct.c libavcodec/fdctdsp.c libavcodec/ffjni.c libavcodec/Golomb.c libavcodec/h2645_parse.c libavcodec/h264_mp4toannexb_bsf.c libavcodec/h264_parse.c libavcodec/h264_parser.c libavcodec/h264_ps.c libavcodec/h264_sei.c libavcodec/h264data.c libavcodec/h264dsp.c libavcodec/h264IDct.c libavcodec/hevc_data.c libavcodec/hevc_mp4toannexb_bsf.c libavcodec/hevc_parse.c libavcodec/hevc_parser.c libavcodec/hevc_ps.c libavcodec/hevc_sei.c libavcodec/IDctdsp.c libavcodec/imgconvert.c libavcodec/jfdctfst.c libavcodec/jfdctint.c libavcodec/jni.c libavcodec/jrevdct.c libavcodec/mathtables.c libavcodec/mediacodec.c libavcodec/mediacodec_surface.c libavcodec/mediacodec_sw_buffer.c libavcodec/mediacodec_wrapper.c libavcodec/mediacodecdec.c libavcodec/mediacodecdec_common.c libavcodec/mjpegenc_huffman.c libavcodec/mpeg12framerate.c libavcodec/mpeg4audio.c libavcodec/mpegaudiodata.c libavcodec/null_bsf.c libavcodec/options.c libavcodec/parser.c libavcodec/parsers.c libavcodec/profiles.c libavcodec/pthread.c libavcodec/pthread_frame.c libavcodec/pthread_slice.c libavcodec/qsv_API.c libavcodec/raw.c libavcodec/simple_IDct.c libavcodec/startcode.c libavcodec/utils.c libavcodec/v4l2_buffers.c libavcodec/v4l2_context.c libavcodec/v4l2_fmt.c libavcodec/v4l2_m2m.c libavcodec/vorbis_parser.c libavcodec/xiph.c libavutil/../compat/strtod.c libavutil/aarch64/cpu.c libavutil/aarch64/float_dsp_init.c libavutil/aarch64/float_dsp_neon.S libavutil/adler32.c libavutil/aes.c libavutil/aes_ctr.c libavutil/audio_fifo.c libavutil/avsscanf.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/dovi_Meta.c libavutil/downmix_info.c libavutil/encryption_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/hdr_dynamic_Metadata.c libavutil/hmac.c libavutil/hwcontext.c libavutil/hwcontext_mediacodec.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/slicethread.c libavutil/spherical.c libavutil/stereo3d.c libavutil/tea.c libavutil/threadmessage.c libavutil/time.c libavutil/timecode.c libavutil/tree.c libavutil/twofish.c libavutil/tx.c libavutil/tx_double.c libavutil/tx_float.c libavutil/tx_int32.c libavutil/utils.c libavutil/vIDeo_enc_params.c libavutil/xga_Font_data.c libavutil/xtea.c)add_library(ffmpeg ${ffmpeg_sources})target_include_directorIEs(ffmpeg PUBliC ./)
3. 在AndroID NDK工程中引用ffmpeg依赖库在自己C++工程的CMakeLists.txt中增加
add_subdirectory({ffmpeg_dir} ./ffmpeg)target_link_librarIEs( {lib_name} ... ffmpeg z)
同步Gradle之后就能尝试build,通过后就可以愉快的deBUG之旅了。
总结以上是内存溢出为你收集整理的FFmpeg在Android Studio中断点调试全部内容,希望文章能够帮你解决FFmpeg在Android Studio中断点调试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)