FFmpeg在Android Studio中斷點除錯
阿新 • • 發佈:2020-12-07
一般情況下在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之旅了。