android studio 动画引擎,FFmpeg在Android Studio中断点调试

一般情况下在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/bash

API=21

NDK=/home/user/Android/ndk/android-ndk-r21

PREBUILT=$NDK/toolchains/llvm/prebuilt/linux-x86_64

PREFIX=/home/user/Desktop/ffmpeg/arm64-v8a

CONFIGURE_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。

2. 创建ffmpeg CMake依赖库

执行完上面步骤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之旅了。

你可能感兴趣的:(android,studio,动画引擎)