在 Android Studio 中調(diào)試 FFmpeg
一般情況下在Android平臺(tái)使用FFmpeg為動(dòng)態(tài)庫或靜態(tài)庫的形式,只能通過設(shè)置FFmpeg日志回調(diào)來看一些FFmpeg輸出的日志,有時(shí)需要debug來查看FFmpeg內(nèi)部執(zhí)行過程。
本文記錄一下在Android Studio中使用FFmpeg源碼進(jìn)行斷點(diǎn)調(diào)試的方法。需在Linux或macOS下,Windows 10系統(tǒng)可以使用wsl子系統(tǒng)。
1. 編寫FFmpeg配置腳本
在此之前需要準(zhǔn)備FFmpeg源碼,NDK(Android SDK文件夾下的ndk-bundle或者ndk下的特定版本,wsl子系統(tǒng)需要單獨(dú)下載)Linux版)。
用來調(diào)試的工程開啟盡量少的功能,下面以調(diào)試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++
在終端中進(jìn)入FFmpeg根目錄,增加執(zhí)行權(quán)限 chmod +x armv8a_config.sh,并執(zhí)行./armv8a_config.sh。
2. 創(chuàng)建ffmpeg CMake依賴庫
執(zhí)行完上面步驟ffmpeg會(huì)自動(dòng)配置好Makefile,然后執(zhí)行make -j8 > sources.txt,此步驟主要用來獲取所有需要的源文件(如果有更好的辦法獲取源文件列表,可以在評(píng)論區(qū)告訴我)。
在FFmpeg根目錄創(chuàng)建CMakeLists.txt文件,復(fù)制上步生成的sources.txt文件中的.o后綴的所有行,并改后綴為.c,部分文件為.S,創(chuàng)建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之旅了。
作者:VE視頻引擎
來源:https://segmentfault.com/a/1190000038403006
-- END --
推薦:
Android FFmpeg 實(shí)現(xiàn)帶濾鏡的微信小視頻錄制功能
全網(wǎng)最全的 Android 音視頻和 OpenGL ES 干貨,都在這了
FFmpeg + Android AudioRecorder 音頻錄制編碼
