FFmpeg 在 Android Studio 中断点调试

2020-12-07 17:34:31 +08:00
 zoule

一般情况下在 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 之旅了。

1695 次点击
所在节点    FFmpeg
1 条回复
Jabin
2020-12-08 09:00:48 +08:00
thumb

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/733030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX