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

FFmpeg在Android Studio中断点调试的更多相关文章

  1. android studio ndk 调试

    一: 先看看用 ndk-gdb 手动调试 这种方法只适用于手动编写 Android.mk 的情况,因为我们要手动 build debug 版本的 .so 文件.具体可以参考我的前一篇文章. 1 And ...

  2. Android Studio & eclipse 调试技巧

    如上图设置多个断点,开启调试.想跨断点移动到下一个断点,点击如下图1箭头,程序将运行一个断点到下一个断点之间需要执行的代码.如果后面代码没有断点,再次点击该按钮将会执行完程序.点击箭头2指向的按钮,可 ...

  3. Android Studio 动态调试 apk 反编译出的 smali 代码

    在信安大赛的准备过程中,主要通过 Android Studio 动态调试 apk 反编译出来的 smali 代码的方式来对我们分析的执行流程进行验证.该技巧的主要流程在此记录.以下过程使用 Andro ...

  4. Android Studio断点调试

    Android Studio断点调试 Android Studio包含一个debugger程序,可以帮助你在模拟器和真机上调试你的android应用.通过Android Studio的debugger ...

  5. (转载) Android Studio你不知道的调试技巧

    Android Studio你不知道的调试技巧 标签: android studio 2015-12-29 16:05 2514人阅读 评论(0) 收藏 举报  分类: android(74)    ...

  6. 【原创】如何在Android Studio下调试原生安卓Framework层面的源代码

    1. Open Existing Android Studio Project. 2. 打开后, Projects -> Android 里面是空的. 这时候,需要选到 Projects-> ...

  7. Android Studio开发调试使用

    Android Studio调试其实也非常方便,一般问题直接通过AS的DDMS的Logcat就可以搞定.AS支持类似Eclipse的DDMS的所有功能.这里要说的是疑难问题的调试方式,即断点调试. 首 ...

  8. 如何使用Android Studio开发/调试Android源码

    本文是以源码中development/tools/idegen/README作为指导文档. 环境: Ubuntu 14.10,openJdk 1.7,Android Studio 1.0.2,andr ...

  9. Android studio动态调试smali

    前面介绍了使用IDA动态调试smali,这种方法设置简单,不用重打包,用起来方便,但是如果变量类型设置错误则会马上退出调试,这是让人不爽的地方,而使用Android studio则不会.   0x01 ...

随机推荐

  1. Java设计系列之书店管理系统单机版

    书店管理系统: 项目练习目标 :1.Java应用程序基本分析2.培养面向对象编程的基本思想3.Java基本设计模式综合应用4.掌握分层和接口的基本设计5.构建合理的Java应用程序包结构6.综合应用J ...

  2. Ceph OSD服务失效自动启动控制

    前言 服务器上面的服务会因为各种各样的原因失败,磁盘故障,权限问题,或者是服务过载引起超时,这些都可能引起 这个在ceph里面systemctl unit 默认有个on-fail restart,默认 ...

  3. RBD快速删除的方法分析与改进

    前言 这个问题在很久以前就有一篇文章进行过讨论 remove-big-rbd,这个文章写的比较清楚了,并且对不同的方法做了分析,这里先把结论说下 rbd类型 rbd rm 方法 rados -p rm ...

  4. redmine系统部署

    1.下载railsinstaller.注意版本,我用的是老版的 railsinstaller-3.2.0.exe 下载地址 http://railsinstaller.org/en 国外的网站比较慢, ...

  5. oracle 11.2.0.4静默安装

    oracle 11.2.0.4静默安装 1.安装包 1.1.上传安装包 xshell可用rz命令,选择安装包. mobaxterm可用左侧栏上传功能. 2.安装准备 2.1.关闭防火墙.SELinux ...

  6. MathType总结编辑括号的类型(上)

    括号的种类有很多,我们用得也很多,可以说无处不见,不只是在数学物理这些自然科学的公式中来断地出现括号,即使是在人文艺术类的领域也会有括号的出现.下面就和小编一起来看看公式编辑器编辑括号的类型吧! Ma ...

  7. ABBYY FineReader 15如何比较文档?

    ABBYY FineReader 15 OCR文字识别软件能帮助用户快速地对比两个文档间的差异,适合用于审阅.修改文档,发现新旧版本差异,预防输出错误版本等情况.此功能既能用于对比同一格式文档的不同版 ...

  8. FL Studio通道常规设置

    每个通道设置窗口都包含声相.音量.音高和混音音轨等.刚学习FL Studio的同学可能对这些旋钮的功能还不是很了解,所以也就直接导致了不能很好的运用.为了帮助同学进一步熟悉这款软件,小编今天将为大家详 ...

  9. EasyRecovery扫描预览功能,助你选择需要的数据恢复

    说到数据恢复,很多人都会选择EasyRecovery,EasyRecovery作为一个功能性还不错的数据恢复软件,能够帮你恢复丢失的数据以及重建文件系统. 在数据恢复的同时,EasyRecovery还 ...

  10. 【性能测试】【locust】场景性能测试步骤

    场景设计 实现登陆基本功能,输出相应结果,脚本通 多用户实现随机登陆 添加初始化方法on_start: 每个用户只运行一次 添加检查点: catch_responses = True 脚本设计 # 导 ...