通常狀況下在Android平臺使用FFmpeg爲動態庫或靜態庫的形式,只能經過設置FFmpeg日誌回調來看一些FFmpeg輸出的日誌,有時須要debug來查看FFmpeg內部執行過程,本文記錄一下在Android Studio中使用FFmpeg源碼進行斷點調試的方法。需在Linux或macOS下,Windows 10系統能夠使用wsl子系統。html
在此以前須要準備FFmpeg源碼
,NDK(Android SDK文件夾下的ndk-bundle或者ndk下的特定版本,wsl子系統須要單獨下載)Linux版)。linux
用來調試的工程開啓儘可能少的功能,下面以調試FFmpeg(4.3.1)硬解h264爲例,在FFmpeg根目錄下新建文件armv8a_config.shandroid
#!/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
。api
執行完上面步驟ffmpeg會自動配置好Makefile,而後執行make -j8 > sources.txt
,此步驟主要用來獲取全部須要的源文件(若是有更好的辦法獲取源文件列表,能夠在評論區告訴我)。bash
在FFmpeg根目錄建立CMakeLists.txt文件,複製上步生成的sources.txt文件中的.o
後綴的全部行,並改後綴爲.c
,部分文件爲.S
,建立ffmpeg依賴庫app
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 ./)
在本身C++工程的CMakeLists.txt中增長dom
add_subdirectory({ffmpeg_dir} ./ffmpeg) target_link_libraries( {lib_name} ... ffmpeg z)
同步Gradle以後就能嘗試build,經過後就能夠愉快的debug之旅了。ide