V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zoule
V2EX  ›  FFmpeg

FFmpeg 在 Android Studio 中断点调试

  •  
  •   zoule · 2020-12-07 17:34:31 +08:00 · 1504 次点击
    这是一个创建于 1208 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    1 条回复    2020-12-08 09:00:48 +08:00
    Jabin
        1
    Jabin  
       2020-12-08 09:00:48 +08:00
    thumb
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4392 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 240ms · UTC 10:06 · PVG 18:06 · LAX 03:06 · JFK 06:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.