copy from zhujiamin
各Android版本FFmpeg编译流程图


二、FFmpeg内部配置(configure)编译(Mkaefile)流程知识

configure:FFmpeg配置文件,用于检测FFmpeg的编译环境,并根据用户配置的选项生成config.mak,config.h等文件,提供给Makefile使用

configure的整体流程可以分成以下几步:


Makefile:FFmpeg的Makefile文件,根据configure生成的配置文件编译源码,与之相关的文件主要有:
config.mak:由configure生成的Makefile,保存了用户在configure的配置信息
libxxx/Makefile:每个类库的Makefile
library.mak:编译类库的Makefile(和libxxx/Makefile配合使用)
common.mak:包含一些通用代码的Makefile


三、编译工作:放置NDK、编译脚本写法、配置项介绍

FFmpeg的NDK编译环境已上传至SVN:http://svn.adc.com/svn_tcpm/Multi_intelligence

8+R项目的FFmpeg源码目录为vendor/oplus/multimedia/mmserver/oplusmedia/libffmpeg_utils/ffmpeg_cm_14_1/

编译脚本:vendor/oplus/multimedia/mmserver/oplusmedia/libffmpeg_utils/ffmpeg_cm_14_1/build_ffmpeg_android.sh

1.设置ndk及其工具链路径,ndk路径默认放在编译服务器根目录,以及android api版本(使用最新的api版本29,实测编译生成的so在P/Q/R版本都能正常使用)

8+R项目编译FFmpeg使用的是ndkr20,ndk r17及之前的版本使用gcc编译器,之后版本已弃用gcc改用clang编译器,两种ndk版本中的系统目录(包含编译链接过程引用的系统库、文件)、工具链、编译器等路径不同,clang编译环境在llvm目录下

2.将整体编译框架写在build()函数,分别编译32位armv7-a和64位armv8-a,编译流程主要是configure、make

3.编译FFmpeg的重点是在configure配置项的写法,每个配置项的描述可以在用命令“./configure --help”查看

整个configure()函数的目的就是为了执行最后一行./configure,为了适配不同指令架构,先定义一些配置变量再保存到CONFIG_FLAGS,接下来逐一介绍编译所需的配置项

–target-os=OS compiler targets OS [$target_os]
指定编译目标系统为android(网上有不少教程指定为linux系统,生成的so格式如"libavutil.so.57",无法在android系统使用,需要修改configure中的命名规则。指定为android即可无需修改configure)

–prefix=PREFIX install in PREFIX [$prefix_default]
make install文件下载路径,下载到FFmpeg根目录的android文件夹,并根据arm架构创建子目录

–arch=ARCH select architecture [$arch]
指定arm架构

–sysroot=PATH root of cross-build tree
交叉构建系统目录(包含编译链接过程引用的系统库、文件),clang的sysroot在llvm目录下

–cross-prefix=PREFIX use PREFIX for compilation tools [$cross_prefix]
指定编译工具的前缀名,这样就无需单独配置编译链接工具,统一通过前缀名找到

–cc=CC use C compiler CC [ c c d e f a u l t ] − − c x x = C X X u s e C c o m p i l e r C X X [ cc_default] --cxx=CXX use C compiler CXX [ ccd​efault]−−cxx=CXXuseCcompilerCXX[cxx_default]
指定C编译器

–extra-cflags=ECFLAGS add ECFLAGS to CFLAGS [$CFLAGS]
添加C编译器选项,通常用于指定额外头文件路径、架构、fpu等,如-I/usr/include(引用Linux系统头文件)

–extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
指定编译器的一些优化参数和额外引用库路径,如-L/usr/lib(链接Linux系统库),-nostdlib(不链接系统标准启动文件和标准库文件)

–extra-libs=ELIBS add ELIBS []
指定额外引用库的名字

enable和disable配置项:

启用:交叉编译、编译动态库、位置无关代码、neon优化、汇编优化(–enable-asm,一定要打开,大幅度提升解码速度)、dav1d解码库

禁用:编译静态库、ffmpeg、ffplay、ffprobe等工具,avdevice、avfilter、devices、filters、doc、symver、network、encoders、muxers等与OPPO播放框架无关的内容,

FFmpeg内置的demuxer、decoder默认是全部打开的,无需再enable

切记不要配置–enable-gpl,打开GPL需要将代码开源,因此依赖GPL协议的配置项也不能使用,如x264、x265、xavs2等

–enable-debug=LEVEL set the debug level []
–disable-stripping disable stripping of executables and shared libraries
编译带符号表的库,size会很大。默认注释掉的,需要debug时打开

四、执行编译

执行./build_ffmpeg_android.sh,so编译到–prefix指定的路径

同时,脚本会将so拷贝到prebuilt目录。之后编译Android代码时,Android.mk通过预编译的方式将so分别copy到system和vendor分区,供其它module使用

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
LOCAL_MODULE                := libavcodec_vendor
LOCAL_PROPRIETARY_MODULE    := true
LOCAL_INSTALLED_MODULE_STEM := libavcodec.so
LOCAL_MODULE_CLASS          := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX         := .so
LOCAL_STRIP_MODULE          := false
LOCAL_MULTILIB              := 32
LOCAL_MUDULE_PATH           := $(TAGET_OUT_VENDOR)/lib
LOCAL_MODULE_TAGS           := optional
LOCAL_REQUIRED_MODULES      := libavcodec
LOCAL_SRC_FILES             := ./lib/libavcodec.so
LOCAL_CHECK_ELF_FILES       := false
include $(BUILD_PREBUILT)include $(CLEAR_VARS)
LOCAL_MODULE                := libavcodec_vendor
LOCAL_PROPRIETARY_MODULE    := true
LOCAL_INSTALLED_MODULE_STEM := libavcodec.so
LOCAL_MODULE_CLASS          := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX         := .so
LOCAL_STRIP_MODULE          := false
LOCAL_MULTILIB              := 64
LOCAL_MUDULE_PATH           := $(TAGET_OUT_VENDOR)/lib64
LOCAL_MODULE_TAGS           := optional
LOCAL_REQUIRED_MODULES      := libavcodec
LOCAL_SRC_FILES             := ./lib64/libavcodec.so
LOCAL_CHECK_ELF_FILES       := false
include $(BUILD_PREBUILT)

至此,FFmpeg源码库的编译方法已经讲完了,dav1d解码库的编译,以及FFmpeg编译和调试的技巧后面再介绍

20220920本地试验如下:
下载了ffmpeg 源码和android-ndk工具
https://blog.csdn.net/m0_46278037/article/details/113790540
可能有的服务器需要安装make等工具
sudo apt-get install -y gcc automake autoconf libtool make

#!/bin/bash
if ["$NDK_HOME" == ""]
thenexport NDK_HOME=./../android-ndk-r20becho NDK variable not set , assuming ${NDK_HOME}
fiHOST_TAG=linux-x86_64
TOOLCHAIN=$NDK_HOME/toolchains/llvm/prebuilt/$HOST_TAG
API=29configure()
{CPU=$1PREFIX=`pwd`/android/$CPUARCH=""SYSROOT=""CROSS_PREFIX=""CC=""CXX=""EXTRA_CFLAGS=""EXTRA_LDFLAGS=""EXTRA_LIBS=""if [ "$CPU" = "armv7a" ]thenARCH=armSYSROOT=$TOOLCHAIN/sysrootCROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clangCXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++EXTRA_CFLAGS="-march=armv7-a -marm -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon "elseARCH=aarch64SYSROOT=$TOOLCHAIN/sysrootCROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clangCXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++EXTRA_CFLAGS="-march=armv8-a "fiCONFIG_FLAG="--target-os=android \
--prefix=$PREFIX \
--arch=$ARCH \
--sysroot=$SYSROOT \
--cross-prefix=$CROSS_PREFIX \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--enable-shared \
--enable-neon \
--enable-pic \
--enable-asm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-static \
--disable-network \
--disable-doc \
--disable-symver \
--disable-avdevice \
--disable-avfilter \
--disable-devices \
--disable-filters \
--disable-encoders \
--disable-muxers \
--disable-decoders \
--enable-decoder=aac \
--enable-decoder=aac_fixed \
--enable-decoder=aac_latm \
--disable-decoder=aasc \
--enable-decoder=ac3 \
--enable-decoder=ac3_fixed \
--disable-decoder=acelp_kelvin \
--disable-decoder=adpcm_4xm \
--disable-decoder=adpcm_adx \
--disable-decoder=adpcm_afc \
--disable-decoder=adpcm_agm \
--disable-decoder=adpcm_aica \
--disable-decoder=adpcm_argo \
--disable-decoder=adpcm_ct \
--disable-decoder=adpcm_dtk \
--disable-decoder=adpcm_ea \
--disable-decoder=adpcm_ea_maxis_xa \
--disable-decoder=adpcm_ea_r1 \
--disable-decoder=adpcm_ea_r2 \
--disable-decoder=adpcm_ea_r3 \
--disable-decoder=adpcm_ea_xas \
--disable-decoder=adpcm_g722 \
--disable-decoder=adpcm_g726 \
--disable-decoder=adpcm_g726le \
--disable-decoder=adpcm_ima_acorn \
--disable-decoder=adpcm_ima_alp \
--disable-decoder=adpcm_ima_amv \
--disable-decoder=adpcm_ima_apc \
--disable-decoder=adpcm_ima_apm \
--disable-decoder=adpcm_ima_cunning \
--disable-decoder=adpcm_ima_dat4 \
--disable-decoder=adpcm_ima_dk3 \
--disable-decoder=adpcm_ima_dk4 \
--disable-decoder=adpcm_ima_ea_eacs \
--disable-decoder=adpcm_ima_ea_sead \
--disable-decoder=adpcm_ima_iss \
--disable-decoder=adpcm_ima_moflex \
--disable-decoder=adpcm_ima_mtf \
--disable-decoder=adpcm_ima_oki \
--disable-decoder=adpcm_ima_qt \
--disable-decoder=adpcm_ima_rad \
--disable-decoder=adpcm_ima_smjpeg \
--disable-decoder=adpcm_ima_ssi \
--disable-decoder=adpcm_ima_wav \
--disable-decoder=adpcm_ima_ws \
--disable-decoder=adpcm_ms \
--disable-decoder=adpcm_mtaf \
--disable-decoder=adpcm_psx \
--disable-decoder=adpcm_sbpro_2 \
--disable-decoder=adpcm_sbpro_3 \
--disable-decoder=adpcm_sbpro_4 \
--disable-decoder=adpcm_swf \
--disable-decoder=adpcm_thp \
--disable-decoder=adpcm_thp_le \
--disable-decoder=adpcm_vima \
--disable-decoder=adpcm_xa \
--disable-decoder=adpcm_yamaha \
--disable-decoder=adpcm_zork \
--disable-decoder=agm \
--disable-decoder=aic \
--enable-decoder=alac \
--disable-decoder=alias_pix \
--disable-decoder=als \
--enable-decoder=amrnb \
--enable-decoder=amrwb \
--disable-decoder=amv \
--disable-decoder=anm \
--disable-decoder=ansi \
--enable-decoder=ape \
--disable-decoder=apng \
--disable-decoder=aptx \
--disable-decoder=aptx_hd \
--disable-decoder=arbc \
--disable-decoder=argo \
--disable-decoder=ass \
--disable-decoder=asv1 \
--disable-decoder=asv2 \
--disable-decoder=atrac1 \
--disable-decoder=atrac3 \
--disable-decoder=atrac3al \
--disable-decoder=atrac3p \
--disable-decoder=atrac3pal \
--disable-decoder=atrac9 \
--disable-decoder=aura \
--disable-decoder=aura2 \
--enable-decoder=av1 \
--disable-decoder=avrn \
--disable-decoder=avrp \
--enable-decoder=avs \
--disable-decoder=avui \
--disable-decoder=ayuv \
--disable-decoder=bethsoftvid \
--disable-decoder=bfi \
--disable-decoder=bink \
--disable-decoder=binkaudio_dct \
--disable-decoder=binkaudio_rdft \
--disable-decoder=bintext \
--disable-decoder=bitpacked \
--enable-decoder=bmp \
--disable-decoder=bmv_audio \
--disable-decoder=bmv_video \
--disable-decoder=brender_pix \
--disable-decoder=c93 \
--disable-decoder=cavs \
--disable-decoder=ccaption \
--disable-decoder=cdgraphics \
--disable-decoder=cdtoons \
--disable-decoder=cdxl \
--disable-decoder=cfhd \
--disable-decoder=cinepak \
--disable-decoder=clearvideo \
--disable-decoder=cljr \
--disable-decoder=cllc \
--disable-decoder=comfortnoise \
--disable-decoder=cook \
--disable-decoder=cpia \
--disable-decoder=cri \
--disable-decoder=cscd \
--disable-decoder=cyuv \
--disable-decoder=dca \
--disable-decoder=dds \
--disable-decoder=derf_dpcm \
--disable-decoder=dfa \
--disable-decoder=dfpwm \
--enable-decoder=dirac \
--disable-decoder=dnxhd \
--disable-decoder=dolby_e \
--disable-decoder=dpx \
--disable-decoder=dsd_lsbf \
--disable-decoder=dsd_lsbf_planar \
--disable-decoder=dsd_msbf \
--disable-decoder=dsd_msbf_planar \
--disable-decoder=dsicinaudio \
--disable-decoder=dsicinvideo \
--disable-decoder=dss_sp \
--disable-decoder=dst \
--disable-decoder=dvaudio \
--disable-decoder=dvbsub \
--disable-decoder=dvdsub \
--enable-decoder=dvvideo \
--disable-decoder=dxa \
--disable-decoder=dxtory \
--disable-decoder=dxv \
--enable-decoder=eac3 \
--disable-decoder=eacmv \
--disable-decoder=eamad \
--disable-decoder=eatgq \
--disable-decoder=eatgv \
--disable-decoder=eatqi \
--disable-decoder=eightbps \
--disable-decoder=eightsvx_exp \
--disable-decoder=eightsvx_fib \
--disable-decoder=escape124 \
--disable-decoder=escape130 \
--disable-decoder=evrc \
--disable-decoder=exr \
--enable-decoder=fastaudio \
--disable-decoder=ffv1 \
--disable-decoder=ffvhuff \
--disable-decoder=ffwavesynth \
--disable-decoder=fic \
--disable-decoder=fits \
--enable-decoder=flac \
--disable-decoder=flashsv \
--disable-decoder=flashsv2 \
--enable-decoder=flic \
--enable-decoder=flv \
--disable-decoder=fmvc \
--disable-decoder=fourxm \
--disable-decoder=fraps \
--disable-decoder=frwu \
--disable-decoder=g2m \
--disable-decoder=g723_1 \
--disable-decoder=g729 \
--disable-decoder=gdv \
--disable-decoder=gem \
--enable-decoder=gif \
--disable-decoder=gremlin_dpcm \
--disable-decoder=gsm \
--disable-decoder=gsm_ms \
--enable-decoder=h261 \
--enable-decoder=h263 \
--enable-decoder=h263_v4l2m2m \
--enable-decoder=h263i \
--enable-decoder=h263p \
--enable-decoder=h264 \
--enable-decoder=h264_v4l2m2m \
--disable-decoder=hap \
--disable-decoder=hca \
--disable-decoder=hcom \
--enable-decoder=hevc \
--enable-decoder=hevc_v4l2m2m \
--disable-decoder=hnm4_video \
--disable-decoder=hq_hqa \
--disable-decoder= \
--disable-decoder=hqx \
--disable-decoder=huffyuv \
--disable-decoder=hymt \
--disable-decoder=iac \
--disable-decoder=idcin \
--disable-decoder=idf \
--disable-decoder=iff_ilbm \
--disable-decoder=ilbc \
--disable-decoder=imc \
--disable-decoder=imm4 \
--disable-decoder=imm5 \
--disable-decoder=indeo2 \
--disable-decoder=indeo3 \
--disable-decoder=indeo4 \
--disable-decoder=indeo5 \
--disable-decoder=interplay_acm \
--disable-decoder=interplay_dpcm \
--disable-decoder=interplay_video \
--disable-decoder=ipu \
--disable-decoder=jacosub \
--enable-decoder=jpeg2000 \
--disable-decoder=jpegls \
--disable-decoder=jv \
--disable-decoder=kgv1 \
--disable-decoder=kmvc \
--disable-decoder=lagarith \
--disable-decoder=loco \
--disable-decoder=lscr \
--disable-decoder=m101 \
--disable-decoder=mace3 \
--disable-decoder=mace6 \
--disable-decoder=magicyuv \
--disable-decoder=mdec \
--disable-decoder=metasound \
--disable-decoder=microdvd \
--disable-decoder=mimic \
--enable-decoder=mjpeg \
--disable-decoder=mjpegb \
--disable-decoder=mlp \
--disable-decoder=mmvideo \
--disable-decoder=mobiclip \
--disable-decoder=motionpixels \
--disable-decoder=movtext \
--enable-decoder=mp1 \
--enable-decoder=mp1float \
--enable-decoder=mp2 \
--enable-decoder=mp2float \
--enable-decoder=mp3 \
--enable-decoder=mp3adu \
--enable-decoder=mp3adufloat \
--enable-decoder=mp3float \
--enable-decoder=mp3on4 \
--enable-decoder=mp3on4float \
--disable-decoder=mpc7 \
--disable-decoder=mpc8 \
--enable-decoder=mpeg1_v4l2m2m \
--enable-decoder=mpeg1video \
--enable-decoder=mpeg2_v4l2m2m \
--enable-decoder=mpeg2video \
--enable-decoder=mpeg4 \
--enable-decoder=mpeg4_v4l2m2m \
--enable-decoder=mpegvideo \
--enable-decoder=mpl2 \
--disable-decoder=msa1 \
--disable-decoder=mscc \
--disable-decoder=msmpeg4v1 \
--disable-decoder=msmpeg4v2 \
--disable-decoder=msmpeg4v3 \
--disable-decoder=msnsiren \
--disable-decoder=msp2 \
--disable-decoder=msrle \
--disable-decoder=mss1 \
--disable-decoder=mss2 \
--disable-decoder=msvideo1 \
--disable-decoder=mszh \
--disable-decoder=mts2 \
--disable-decoder=mv30 \
--disable-decoder=mvc1 \
--disable-decoder=mvc2 \
--disable-decoder=mvdv \
--disable-decoder=mvha \
--disable-decoder=mwsc \
--disable-decoder=mxpeg \
--disable-decoder=nellymoser \
--disable-decoder=notchlc \
--disable-decoder=nuv \
--disable-decoder=on2avc \
--enable-decoder=opus \
--disable-decoder=paf_audio \
--disable-decoder=paf_video \
--disable-decoder=pam \
--disable-decoder=pbm \
--enable-decoder=pcm_alaw \
--enable-decoder=pcm_bluray \
--enable-decoder=pcm_dvd \
--enable-decoder=pcm_f16le \
--enable-decoder=pcm_f24le \
--enable-decoder=pcm_f32be \
--enable-decoder=pcm_f32le \
--enable-decoder=pcm_f64be \
--enable-decoder=pcm_f64le \
--disable-decoder=pcm_lxf \
--disable-decoder=pcm_mulaw \
--enable-decoder=pcm_s16be \
--enable-decoder=pcm_s16be_planar \
--enable-decoder=pcm_s16le \
--enable-decoder=pcm_s16le_planar \
--enable-decoder=pcm_s24be \
--enable-decoder=pcm_s24daud \
--enable-decoder=pcm_s24le \
--enable-decoder=pcm_s24le_planar \
--enable-decoder=pcm_s32be \
--enable-decoder=pcm_s32le \
--enable-decoder=pcm_s32le_planar \
--enable-decoder=pcm_s64be \
--enable-decoder=pcm_s64le \
--enable-decoder=pcm_s8 \
--enable-decoder=pcm_s8_planar \
--enable-decoder=pcm_sga \
--enable-decoder=pcm_u16be \
--enable-decoder=pcm_u16le \
--enable-decoder=pcm_u24be \
--enable-decoder=pcm_u24le \
--enable-decoder=pcm_u32be \
--enable-decoder=pcm_u32le \
--enable-decoder=pcm_u8 \
--enable-decoder=pcm_vidc \
--disable-decoder=pcx \
--disable-decoder=pfm \
--disable-decoder=pgm \
--disable-decoder=pgmyuv \
--disable-decoder=pgssub \
--disable-decoder=pgx \
--disable-decoder=phm \
--disable-decoder=photocd \
--disable-decoder=pictor \
--disable-decoder=pixlet \
--disable-decoder=pjs \
--disable-decoder=png \
--disable-decoder=ppm \
--disable-decoder=prores \
--disable-decoder=prosumer \
--disable-decoder=psd \
--disable-decoder=ptx \
--disable-decoder=qcelp \
--disable-decoder=qdm2 \
--disable-decoder=qdmc \
--disable-decoder=qdraw \
--disable-decoder=qoi \
--disable-decoder=qpeg \
--disable-decoder=qtrle \
--disable-decoder=r10k \
--disable-decoder=r210 \
--disable-decoder=ra_144 \
--disable-decoder=ra_288 \
--disable-decoder=ralf \
--disable-decoder=rasc \
--disable-decoder=rawvideo \
--disable-decoder=realtext \
--disable-decoder=rl2 \
--disable-decoder=roq \
--disable-decoder=roq_dpcm \
--disable-decoder=rpza \
--disable-decoder=rscc \
--enable-decoder=rv10 \
--enable-decoder=rv20 \
--enable-decoder=rv30 \
--enable-decoder=rv40 \
--disable-decoder=s302m \
--disable-decoder=sami \
--disable-decoder=sanm \
--disable-decoder=sbc \
--disable-decoder=scpr \
--disable-decoder=screenpresso \
--disable-decoder=sdx2_dpcm \
--disable-decoder=sga \
--disable-decoder=sgi \
--disable-decoder=sgirle \
--disable-decoder=sheervideo \
--disable-decoder=shorten \
--disable-decoder=simbiosis_imx \
--disable-decoder=sipr \
--disable-decoder=siren \
--disable-decoder=smackaud \
--disable-decoder=smacker \
--disable-decoder=smc \
--disable-decoder=smvjpeg \
--disable-decoder=snow \
--disable-decoder=sol_dpcm \
--disable-decoder=sonic \
--disable-decoder=sp5x \
--disable-decoder=speedhq \
--disable-decoder=speex \
--disable-decoder=srgc \
--disable-decoder=srt \
--disable-decoder=ssa \
--disable-decoder=stl \
--disable-decoder=subrip \
--disable-decoder=subviewer \
--disable-decoder=subviewer1 \
--disable-decoder=sunrast \
--disable-decoder=svq1 \
--disable-decoder=svq3 \
--disable-decoder=tak \
--disable-decoder=targa \
--disable-decoder=targa_y216 \
--disable-decoder=tdsc \
--disable-decoder=text \
--disable-decoder=theora \
--disable-decoder=thp \
--disable-decoder=tiertexseqvideo \
--disable-decoder=tiff \
--disable-decoder=tmv \
--disable-decoder=truehd \
--disable-decoder=truemotion1 \
--disable-decoder=truemotion2 \
--disable-decoder=truemotion2rt \
--disable-decoder=truespeech \
--disable-decoder=tscc \
--disable-decoder=tscc2 \
--disable-decoder=tta \
--disable-decoder=twinvq \
--disable-decoder=txd \
--disable-decoder=ulti \
--disable-decoder=utvideo \
--disable-decoder=v210 \
--disable-decoder=v210x \
--disable-decoder=v308 \
--disable-decoder=v408 \
--disable-decoder=v410 \
--disable-decoder=vb \
--disable-decoder=vble \
--disable-decoder=vbn \
--enable-decoder=vc1 \
--enable-decoder=vc1_v4l2m2m \
--enable-decoder=vc1image \
--disable-decoder=vcr1 \
--disable-decoder=vmdaudio \
--disable-decoder=vmdvideo \
--disable-decoder=vmnc \
--disable-decoder=vorbis \
--disable-decoder=vp3 \
--disable-decoder=vp4 \
--disable-decoder=vp5 \
--enable-decoder=vp6 \
--enable-decoder=vp6a \
--enable-decoder=vp6f \
--enable-decoder=vp7 \
--enable-decoder=vp8 \
--enable-decoder=vp8_v4l2m2m \
--enable-decoder=vp9 \
--enable-decoder=vp9_v4l2m2m \
--disable-decoder=vplayer \
--disable-decoder=vqa \
--disable-decoder=wavpack \
--disable-decoder=wcmv \
--enable-decoder=webp \
--disable-decoder=webvtt \
--disable-decoder=wmalossless \
--disable-decoder=wmapro \
--disable-decoder=wmav1 \
--disable-decoder=wmav2 \
--disable-decoder=wmavoice \
--enable-decoder=wmv1 \
--enable-decoder=wmv2 \
--enable-decoder=wmv3 \
--enable-decoder=wmv3image \
--disable-decoder=wnv1 \
--disable-decoder=wrapped_avframe \
--disable-decoder=ws_snd1 \
--disable-decoder=xan_dpcm \
--disable-decoder=xan_wc3 \
--disable-decoder=xan_wc4 \
--disable-decoder=xbin \
--disable-decoder=xbm \
--disable-decoder=xface \
--disable-decoder=xl \
--disable-decoder=xma1 \
--disable-decoder=xma2 \
--disable-decoder=xpm \
--disable-decoder=xsub \
--disable-decoder=xwd \
--disable-decoder=y41p \
--disable-decoder=ylc \
--disable-decoder=yop \
--disable-decoder=yuv4 \
--disable-decoder=zero12v \
--disable-decoder=zerocodec \
--disable-decoder=zlib \
--disable-decoder=zmbv \
--disable-parsers \
--disable-demuxers \
--disable-demuxer=aa \
--enable-demuxer=aac \
--disable-demuxer=aax \
--enable-demuxer=ac3 \
--disable-demuxer=ace \
--disable-demuxer=acm \
--disable-demuxer=act \
--disable-demuxer=adf \
--disable-demuxer=adp \
--disable-demuxer=ads \
--disable-demuxer=adx \
--disable-demuxer=aea \
--disable-demuxer=afc \
--disable-demuxer=aiff \
--disable-demuxer=aix \
--disable-demuxer=alp \
--enable-demuxer=amr \
--enable-demuxer=amrnb \
--enable-demuxer=amrwb \
--disable-demuxer=anm \
--disable-demuxer=apc \
--enable-demuxer=ape \
--disable-demuxer=apm \
--disable-demuxer=apng \
--disable-demuxer=aptx \
--disable-demuxer=aptx_hd \
--disable-demuxer=aqtitle \
--disable-demuxer=argo_asf \
--disable-demuxer=argo_brp \
--disable-demuxer=argo_cvg \
--enable-demuxer=asf \
--enable-demuxer=asf_o \
--disable-demuxer=ass \
--disable-demuxer=ast \
--disable-demuxer=au \
--enable-demuxer=av1 \
--enable-demuxer=avi \
--disable-demuxer=avr \
--enable-demuxer=avs \
--enable-demuxer=avs2 \
--enable-demuxer=avs3 \
--disable-demuxer=bethsoftvid \
--disable-demuxer=bfi \
--disable-demuxer=bfstm \
--disable-demuxer=bink \
--disable-demuxer=binka \
--disable-demuxer=bintext \
--disable-demuxer=bit \
--disable-demuxer=bitpacked \
--disable-demuxer=bmv \
--disable-demuxer=boa \
--disable-demuxer=brstm \
--disable-demuxer=c93 \
--disable-demuxer=caf \
--disable-demuxer=cavsvideo \
--disable-demuxer=cdg \
--disable-demuxer=cdxl \
--disable-demuxer=cine \
--disable-demuxer=codec2 \
--disable-demuxer=codec2raw \
--disable-demuxer=concat \
--disable-demuxer=data \
--disable-demuxer=daud \
--disable-demuxer=dcstr \
--disable-demuxer=derf \
--disable-demuxer=dfa \
--disable-demuxer=dfpwm \
--disable-demuxer=dhav \
--disable-demuxer=dirac \
--disable-demuxer=dnxhd \
--disable-demuxer=dsf \
--disable-demuxer=dsicin \
--disable-demuxer=dss \
--disable-demuxer=dts \
--disable-demuxer=dtshd \
--disable-demuxer=dv \
--disable-demuxer=dvbsub \
--disable-demuxer=dvbtxt \
--disable-demuxer=dxa \
--disable-demuxer=ea \
--disable-demuxer=ea_cdata \
--disable-demuxer=eac3 \
--disable-demuxer=epaf \
--disable-demuxer=ffmetadata \
--disable-demuxer=filmstrip \
--disable-demuxer=fits \
--enable-demuxer=flac \
--disable-demuxer=flic \
--enable-demuxer=flv \
--disable-demuxer=fourxm \
--disable-demuxer=frm \
--disable-demuxer=fsb \
--disable-demuxer=fwse \
--disable-demuxer=g722 \
--disable-demuxer=g723_1 \
--disable-demuxer=g726 \
--disable-demuxer=g726le \
--disable-demuxer=g729 \
--disable-demuxer=gdv \
--disable-demuxer=genh \
--enable-demuxer=gif \
--disable-demuxer=gsm \
--disable-demuxer=gxf \
--disable-demuxer=h261 \
--enable-demuxer=h263 \
--enable-demuxer=h264 \
--disable-demuxer=hca \
--disable-demuxer=hcom \
--enable-demuxer=hevc \
--enable-demuxer=hls \
--disable-demuxer=hnm \
--disable-demuxer=ico \
--disable-demuxer=idcin \
--disable-demuxer=idf \
--disable-demuxer=iff \
--enable-demuxer=ifv \
--disable-demuxer=ilbc \
--disable-demuxer=image2 \
--disable-demuxer=image2_alias_pix \
--disable-demuxer=image2_brender_pix \
--disable-demuxer=image2pipe \
--disable-demuxer=image_bmp_pipe \
--disable-demuxer=image_cri_pipe \
--disable-demuxer=image_dds_pipe \
--disable-demuxer=image_dpx_pipe \
--disable-demuxer=image_exr_pipe \
--disable-demuxer=image_gem_pipe \
--disable-demuxer=image_gif_pipe \
--disable-demuxer=image_j2k_pipe \
--disable-demuxer=image_jpeg_pipe \
--disable-demuxer=image_jpegls_pipe \
--disable-demuxer=image_jpegxl_pipe \
--disable-demuxer=image_pam_pipe \
--disable-demuxer=image_pbm_pipe \
--disable-demuxer=image_pcx_pipe \
--disable-demuxer=image_pfm_pipe \
--disable-demuxer=image_pgm_pipe \
--disable-demuxer=image_pgmyuv_pipe \
--disable-demuxer=image_pgx_pipe \
--disable-demuxer=image_phm_pipe \
--disable-demuxer=image_photocd_pipe \
--disable-demuxer=image_pictor_pipe \
--disable-demuxer=image_png_pipe \
--disable-demuxer=image_ppm_pipe \
--disable-demuxer=image_psd_pipe \
--disable-demuxer=image_qdraw_pipe \
--disable-demuxer=image_qoi_pipe \
--disable-demuxer=image_sgi_pipe \
--disable-demuxer=image_sunrast_pipe \
--disable-demuxer=image_svg_pipe \
--disable-demuxer=image_tiff_pipe \
--disable-demuxer=image_vbn_pipe \
--disable-demuxer=image_webp_pipe \
--disable-demuxer=image_xbm_pipe \
--disable-demuxer=image_xpm_pipe \
--disable-demuxer=image_xwd_pipe \
--disable-demuxer=ingenient \
--disable-demuxer=ipmovie \
--disable-demuxer=ipu \
--disable-demuxer=ircam \
--disable-demuxer=iss \
--enable-demuxer=iv8 \
--enable-demuxer=ivf \
--disable-demuxer=ivr \
--disable-demuxer=jacosub \
--disable-demuxer=jv \
--disable-demuxer=kux \
--disable-demuxer=kvag \
--disable-demuxer=live_flv \
--disable-demuxer=lmlm4 \
--disable-demuxer=loas \
--disable-demuxer=lrc \
--disable-demuxer=luodat \
--disable-demuxer=lvf \
--disable-demuxer=lxf \
--enable-demuxer=m4v \
--enable-demuxer=matroska \
--disable-demuxer=mca \
--disable-demuxer=mcc \
--disable-demuxer=mgsts \
--disable-demuxer=microdvd \
--enable-demuxer=mjpeg \
--enable-demuxer=mjpeg_2000 \
--disable-demuxer=mlp \
--disable-demuxer=mlv \
--disable-demuxer=mm \
--disable-demuxer=mmf \
--disable-demuxer=mods \
--disable-demuxer=moflex \
--enable-demuxer=mov \
--enable-demuxer=mp3 \
--disable-demuxer=mpc \
--disable-demuxer=mpc8 \
--enable-demuxer=mpegps \
--enable-demuxer=mpegts \
--enable-demuxer=mpegtsraw \
--enable-demuxer=mpegvideo \
--enable-demuxer=mpjpeg \
--enable-demuxer=mpl2 \
--disable-demuxer=mpsub \
--disable-demuxer=msf \
--disable-demuxer=msnwc_tcp \
--disable-demuxer=msp \
--disable-demuxer=mtaf \
--disable-demuxer=mtv \
--disable-demuxer=musx \
--disable-demuxer=mv \
--disable-demuxer=mvi \
--disable-demuxer=mxf \
--disable-demuxer=mxg \
--disable-demuxer=nc \
--disable-demuxer=nistsphere \
--disable-demuxer=nsp \
--disable-demuxer=nsv \
--disable-demuxer=nut \
--disable-demuxer=nuv \
--disable-demuxer=obu \
--enable-demuxer=ogg \
--disable-demuxer=oma \
--disable-demuxer=paf \
--disable-demuxer=pcm_alaw \
--disable-demuxer=pcm_f32be \
--disable-demuxer=pcm_f32le \
--disable-demuxer=pcm_f64be \
--disable-demuxer=pcm_f64le \
--disable-demuxer=pcm_mulaw \
--disable-demuxer=pcm_s16be \
--disable-demuxer=pcm_s16le \
--disable-demuxer=pcm_s24be \
--disable-demuxer=pcm_s24le \
--disable-demuxer=pcm_s32be \
--disable-demuxer=pcm_s32le \
--disable-demuxer=pcm_s8 \
--disable-demuxer=pcm_u16be \
--disable-demuxer=pcm_u16le \
--disable-demuxer=pcm_u24be \
--disable-demuxer=pcm_u24le \
--disable-demuxer=pcm_u32be \
--disable-demuxer=pcm_u32le \
--disable-demuxer=pcm_u8 \
--disable-demuxer=pcm_vidc \
--disable-demuxer=pjs \
--disable-demuxer=pmp \
--disable-demuxer=pp_bnk \
--disable-demuxer=pva \
--disable-demuxer=pvf \
--disable-demuxer=qcp \
--disable-demuxer=r3d \
--disable-demuxer=rawvideo \
--disable-demuxer=realtext \
--disable-demuxer=redspark \
--disable-demuxer=rl2 \
--disable-demuxer=rm \
--disable-demuxer=roq \
--disable-demuxer=rpl \
--disable-demuxer=rsd \
--disable-demuxer=rso \
--disable-demuxer=s337m \
--disable-demuxer=sami \
--disable-demuxer=sbc \
--disable-demuxer=sbg \
--disable-demuxer=scc \
--disable-demuxer=scd \
--disable-demuxer=sdr2 \
--disable-demuxer=sds \
--disable-demuxer=sdx \
--disable-demuxer=segafilm \
--disable-demuxer=ser \
--disable-demuxer=sga \
--disable-demuxer=shorten \
--disable-demuxer=siff \
--disable-demuxer=simbiosis_imx \
--disable-demuxer=sln \
--disable-demuxer=smacker \
--disable-demuxer=smjpeg \
--disable-demuxer=smush \
--disable-demuxer=sol \
--disable-demuxer=sox \
--disable-demuxer=spdif \
--disable-demuxer=srt \
--disable-demuxer=stl \
--disable-demuxer=str \
--disable-demuxer=subviewer \
--disable-demuxer=subviewer1 \
--disable-demuxer=sup \
--disable-demuxer=svag \
--disable-demuxer=svs \
--disable-demuxer=swf \
--disable-demuxer=tak \
--disable-demuxer=tedcaptions \
--disable-demuxer=thp \
--disable-demuxer=threedostr \
--disable-demuxer=tiertexseq \
--disable-demuxer=tmv \
--disable-demuxer=truehd \
--disable-demuxer=tta \
--disable-demuxer=tty \
--disable-demuxer=txd \
--disable-demuxer=ty \
--disable-demuxer=v210 \
--disable-demuxer=v210x \
--disable-demuxer=vag \
--enable-demuxer=vc1 \
--enable-demuxer=vc1t \
--disable-demuxer=vividas \
--disable-demuxer=vivo \
--disable-demuxer=vmd \
--disable-demuxer=vobsub \
--disable-demuxer=voc \
--disable-demuxer=vpk \
--disable-demuxer=vplayer \
--disable-demuxer=vqf \
--disable-demuxer=w64 \
--enable-demuxer=wav \
--disable-demuxer=wc3 \
--enable-demuxer=webm_dash_manifest \
--disable-demuxer=webvtt \
--disable-demuxer=wsaud \
--disable-demuxer=wsd \
--disable-demuxer=wsvqa \
--disable-demuxer=wtv \
--disable-demuxer=wv \
--disable-demuxer=wve \
--disable-demuxer=xa \
--disable-demuxer=xbin \
--disable-demuxer=xmv \
--disable-demuxer=xvag \
--disable-demuxer=xwma \
--disable-demuxer=yop \
--disable-demuxer=yuv4mpegpipe
"echo $CONFIG_FLAG --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-libs="$EXTRA_LIBS"
./configure $CONFIG_FLAG --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-libs="$EXTRA_LIBS"
}build()
{CPU=$1echo "build $CPU"configure $CPUmake -j32make installif [ "$CPU" = "armv7a" ]thenmkdir -p $(pwd)/prebuild/libcp $(pwd)/android/$CPU/lib/*.so* $(pwd)/prebuild/libelsemkdir -p $(pwd)/prebuild/lib64cp $(pwd)/android/$CPU/lib/*.so* $(pwd)/prebuild/lib64fimake clean
}make cleanbuild armv7a
build aarch64

添加protocol

1.在libavformat/Makefile中添加protocol文件, 才会更新到新的so中

protocols I/O

OBJS-$(CONFIG_ANDROID_PROTOCOL) += android.o

2.在libavformat中新增android.c来扩展私有协议

/** ANDROID Protocol* Copyright (c) 2022 V* add by VinterYoung*/#include "avformat.h"
#include "internal.h"
#include "network.h"
#include "os_support.h"
#include "url.h"
#include "tls.h"
#include "libavutil/avstring.h"
#include "libavutil/getenv_utf8.h"
#include "libavutil/opt.h"
#include "libavutil/parseutils.h"typedef struct AndroidContext {const AVClass *class;int fd;int trunc;int blocksize;int follow;int seekable;DIR *dir;
} AndroidContext;static const AVOption options[] = {{ "truncate", "truncate existing files on write", offsetof(AndroidContext, trunc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },{ "blocksize", "set I/O operation maximum block size", offsetof(AndroidContext, blocksize), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },{ "follow", "Follow a file as it is being written", offsetof(AndroidContext, follow), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },{ "seekable", "Sets if the file is seekable", offsetof(AndroidContext, seekable), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 0, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM },{ NULL }
};static const AVClass android_context_class = {.class_name = "android",.item_name  = av_default_item_name,.option     = options,.version    = LIBAVUTIL_VERSION_INT,
};static int android_open(URLContext *h, const char *url, int flags)
{return 0;
}
static int android_read(URLContext *h, unsigned char *buf, int size)
{return 0;
}static int android_write(URLContext *h, const unsigned char *buf, int size)
{return -1;
}static int64_t android_seek(URLContext *h, int64_t pos, int whence)
{return 0;
}static int android_close(URLContext *h)
{return 0;
}static int android_get_handle(URLContext *h)
{return (intptr_t)h->priv_data;
}static int android_check(URLContext *h, int mask)
{return (mask & AVIO_FLAG_READ);
}const URLProtocol ff_android_protocol = {.name                = "android",.url_open            = android_open,.url_read            = android_read,.url_seek            = android_seek,.url_close           = android_close,.url_get_file_handle = android_get_handle;.url_check           = android_check;.priv_data_size      = sizeof(AndroidContext),.priv_data_class     = &android_context_class,
};

3.build.sh中使能android protocol,

4.在libavformat/protocol.c中注册androd protocol
extern const URLProtocol ff_android_protocol;

在第4步注册androidprotocol后, 会出现libfffmpegextractor.so dlopen失败.(应该是有依赖的so出现异常.推测是libavformat.so出现crash之类的问题)

二.ffmpeg 编译和配置相关推荐

  1. Ubuntu系统ffmpeg 编译decklink配置

    1,下载资源包 ffmpeg-decklink资源包 2,下载decklink ,linux系统的sdk Blackmagic官网或者csdn 3,修改ffmpeg-decklink资源包中build ...

  2. 【Android FFMPEG 开发】音视频基础 和 FFMPEG 编译 ( 音视频基础 | MPEG-4 标准 | Android 开发环境 | FFMPEG 交叉编译 | 安卓项目导入配置 )

    本篇博客代码及资源下载 : https://download.csdn.net/download/han1202012/10382762 文章目录 一. 音视频基础 1. 音频基础 (1) 声音要素 ...

  3. ffmpeg编译配置选项

    ffmpeg编译配置 编译常用选项 编译选项 编译常用选项 ./configure --disable-asm --enable-avdevice --disable-doc --disable-pr ...

  4. arm linux 内核配置,嵌入式 Linux开发Kernel移植(二)——kernel内核配置和编译

    嵌入式 Linux开发Kernel移植(二)--kernel内核配置和编译 本文选择linux 2.6.35.7版本kernel进行实践. 一.linux kernel源码目录分析 Kbuild,Ke ...

  5. windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载

    经过一晚上加一上午的奋斗,终于成功编译出了最新版的FFMPEG,下面是我编译的心得,因为是最新的,应该会对大家有用,编译的FFMPEG的版本是0.11.2,2012-09-19新发布的版本 平台:WI ...

  6. Mac 平台 Android FFmpeg 编译与集成实践

    文章目录 FFmpeg 是什么 为什么要学 FFmpeg 开发 FFmpeg 编译 1. 编译环境准备 2. FFmpeg 环境配置 3. 完整的脚本 4. FQA 编译小结 在Android Stu ...

  7. 详细的FFmpeg编译流程与脚本分析

    FFmpeg是一个跨平台的多媒体库,也是目前音视频领域应用最广泛的库.它包括libavcodec.libavformat.libavutil.libavdevice.libavfilter.libsw ...

  8. 搭建webassembly网页播放器(三)---emcc编译ffmpeg编译库

    经过前面的2个部分,我们完成了环境的搭建,接下来我们使用emcc编译ffmpeg库,注意同样由于软链接的缘故,我们不能在windows和linux的共享文件夹里使用emcc编译ffmpeg, 这里我们 ...

  9. ffmpeg编译安装

    ffmpeg编译安装 前言 一.下载ffmpeg 二.编译安装 2.1 Linux编译ffmpeg 2.2 Windows编译ffmpeg 总结 前言   Fmpeg是一套可以用来记录.转换数字音频. ...

最新文章

  1. JavaMail邮件别名和主题乱码解决[转]
  2. 基于SSM实现公交路线管理系统
  3. LINQ体验系列文章导航
  4. PAT甲级1144 The Missing Number:[C++题解]哈希表
  5. Java学习前,需要掌握的一些基础知识
  6. pve虚拟机导入gho_迁移WIN10和VMW虚拟机到ProXmoX VE(二):PVE设置和迁移windows
  7. spark streaming python实例_kafka+spark streaming代码实例(pyspark+python)
  8. 签名验签服务器性能测试,签名验签服务器 功率
  9. SpringMVC 异常的处理
  10. Atitit 文件远程传输读写协议 scp http ftp nfs webdav smb D:\Program Files\Git\usr\bin\scp.exe 4.密码安全策略不完善 在
  11. 利用java的jsoup实现:短视频无水印下载
  12. java递归算法 空瓶换水_公务员考试行测指导:思维策略之空瓶换水
  13. xgp游戏列表_PC版XGP正式公布,畅玩上百款游戏每月只需10美元
  14. reflector 插件_Reflector Plus Plus-插件,IronPython和其他Peli Goodness
  15. BTA前瞻 | 这家区块链公司币圈链圈通吃!专访井通科技CTO杨建新
  16. 前端纯CSS导入otf字体包
  17. 关于Git 的管理凭据操作
  18. 常对象只能调用常函数成员 c++
  19. A geometric interpretation of the covariance matrix(reproduced)
  20. css3 呼吸的莲花_CSS3 莲花盛开动画

热门文章

  1. 2023年国家开放大学跟成人高考哪个好?区别是什么?启程别告诉你
  2. 线程池延时类ScheduledExecutorService—比Timer更有效精确的延时工具
  3. 秋大小米2sc刷android 6.0,小米2刷机包 深度移植安卓6.0 支持合并与未合并 优化系统 超级流畅...
  4. 「第三章」跨站脚本攻击(XSS)
  5. C语言习题:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词
  6. SpringBoot自动装配原理解析——面试可以这样会回答
  7. Gin blog 总结1
  8. snprintf()函数使用方法
  9. 阿里:DataWorks一站式大数据开发治理平台
  10. MySQL对不同年龄段的用户信息做统计(附按不同时间段统计记录)