我是靠谱客的博主 阳光水池,最近开发中收集的这篇文章主要介绍记录一次Android交叉编译ffmpeg排查错误,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Android版本手机直播引擎中,引用了libvlc开源库。
项目接过来,发现编译脚本中使用了很多用户名下的绝对路径。
项目相关人离职,导致这个脚本实际上已经废掉。而且不知道相关路径下有没有其他文件和第三方库。
琢磨很久,基本上搞定了路径问题。还剩下一个ffmpeg开源库编译脚本的选择问题。目录下有十几个文件备用。
后来听说是用了一个名为ffmpeg_build.sh的脚本
其中有一段

#function build_one
{
./configure 
--arch=arm 
--cpu=cortex-a8 
--target-os=linux 
--prefix=$prefix 
--enable-cross-compile 
--disable-shared 
--enable-static 
--extra-libs="-lgcc" 
--cc=$CC 
--cross-prefix=$NDK_TOOLCHAIN_BASE/bin/$NDK_ABI-linux-androideabi- 
--sysroot="$NDK_SYSROOT" 
--extra-cflags="-I$X264_PATH/include -I$FDKAAC_PATH/include -I$ARM_INC -march=armv7-a -mfloat-abi=softfp -mtune=cortex-a8 -mfpu=neon -fPIC" 
--extra-ldflags="-L$FDKAAC_PATH/lib/android -L$X264_PATH/lib/android -lc -nostdlib -lm -ldl -mfloat-abi=softfp" 
--disable-symver 
--disable-doc 
--disable-yasm 
--disable-ffmpeg 
--disable-ffplay 
--disable-ffprobe 
--disable-ffserver 
--disable-protocols 
--disable-debug 
--disable-programs 
--disable-encoders 
--disable-decoders 
--disable-filters 
--disable-demuxers 
--disable-avdevice 
--disable-devices 
--disable-muxers 
--disable-parsers 
--disable-armv6t2 
--disable-armv5te 
--disable-bsfs 
--enable-small 
--enable-gpl 
--enable-network 
--enable-neon 
--enable-pthreads 
--enable-libx264 
--enable-zlib 
--enable-nonfree 
--enable-libfdk-aac 
--enable-protocol=rtmp 
--enable-muxer=flv 
--enable-muxer=mp4 
--enable-demuxer=aac 
--enable-demuxer=h264 
--enable-demuxer=flv 
--enable-encoder=libfdk_aac 
--enable-encoder=libx264 
--enable-decoder=libx264 
--enable-decoder=libfdk_aac 
--enable-decoder=aac 
--enable-decoder=h264 
--enable-parser=aac 
--enable-parser=h264 
--enable-bsf=aac_adtstoasc 
--enable-asm 
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4 install
}

直接编译使用,但是在vlc调用ffmpeg的过程中报错。

 

于是根据需求,自己改写了一个版本ffmpeg_build_new.sh。其中那一段如下:

#function build_one
{
./configure 
--arch=arm 
--cpu=cortex-a8 
--target-os=linux 
--prefix=$prefix 
--enable-cross-compile 
--disable-shared 
--enable-static 
--extra-libs="-lgcc" 
--cc=$CC 
--cross-prefix=$NDK_TOOLCHAIN_BASE/bin/$NDK_ABI-linux-androideabi- 
--sysroot="$NDK_SYSROOT" 
--extra-cflags="-I$X264_PATH/include -I$FDKAAC_PATH/include -I$ARM_INC -march=armv7-a -mfloat-abi=softfp -mtune=cortex-a8 -mfpu=neon -fPIC -DANDROID" 
--extra-ldflags="-L$FDKAAC_PATH/lib/android -L$X264_PATH/lib/android -lc -nostdlib -lm -ldl -llog -mfloat-abi=softfp" 
--disable-everything 
--disable-symver 
--disable-doc 
--disable-yasm 
--disable-ffmpeg 
--disable-ffplay 
--disable-ffprobe 
--disable-ffserver 
--disable-parsers 
--disable-protocols 
--disable-demuxers 
--disable-muxers 
--disable-debug 
--disable-filters 
--disable-programs 
--disable-armv6 
--disable-armv6t2 
--disable-armv5te 
--disable-decoders 
--disable-encoders 
--enable-gpl 
--enable-network 
--enable-neon 
--enable-pthreads 
--enable-libx264 
--enable-nonfree 
--enable-libfdk-aac 
--enable-protocol=rtmp 
--enable-protocol=mp4 
--enable-muxer=flv 
--enable-muxer=mp4 
--enable-encoder=libfdk_aac 
--enable-encoder=libx264 
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4 install
}

按照这个脚本,编译出来的libavcodec.a比之前已经在使用的版本文件大小小很多。

在意料中,因为我关掉了不用的编解码器和其他库。
并且使用这个结果,也是报同样的错误。

静下来想一想,我想起一个工具 at -t
于是分析已经在使用的版本libavcodec.a

$ ar -t ~/former/ffmpeg/lib/libavcodec.a
aac_ac3_parser.o
aac_adtstoasc_bsf.o
aac_parser.o
aacadtsdec.o
aacdec.o
aacps.o
aacpsdsp.o
aacsbr.o
aactab.o
allcodecs.o
aacpsdsp_init_arm.o
aacpsdsp_neon.o
fft_fixed_init_arm.o
fft_fixed_neon.o
fft_init_arm.o
fft_neon.o
fft_vfp.o
fmtconvert_init_arm.o
fmtconvert_neon.o
fmtconvert_vfp.o
fmtconvert_vfp_armv6.o
h264chroma_init_arm.o
h264cmc_neon.o
h264dsp_init_arm.o
h264dsp_neon.o
h264idct_neon.o
h264pred_init_arm.o
h264pred_neon.o
h264qpel_init_arm.o
h264qpel_neon.o
hpeldsp_neon.o
idctdsp_arm.o
idctdsp_armv6.o
idctdsp_init_arm.o
idctdsp_init_armv6.o
idctdsp_init_neon.o
idctdsp_neon.o
jrevdct_arm.o
mdct_fixed_neon.o
mdct_neon.o
mdct_vfp.o
me_cmp_armv6.o
me_cmp_init_arm.o
pixblockdsp_armv6.o
pixblockdsp_init_arm.o
sbrdsp_init_arm.o
sbrdsp_neon.o
simple_idct_arm.o
simple_idct_armv6.o
simple_idct_neon.o
startcode_armv6.o
videodsp_init_arm.o
audio_frame_queue.o
audioconvert.o
avdct.o
avfft.o
avpacket.o
avpicture.o
bitstream.o
bitstream_filter.o
cabac.o
codec_desc.o
dsputil_compat.o
dv_profile.o
error_resilience.o
faandct.o
faanidct.o
fdctdsp.o
fft_fixed.o
fft_fixed_32.o
fft_float.o
fft_init_table.o
fmtconvert.o
frame_thread_encoder.o
golomb.o
h264.o
h264_cabac.o
h264_cavlc.o
h264_direct.o
h264_loopfilter.o
h264_mb.o
h264_parser.o
h264_picture.o
h264_ps.o
h264_refs.o
h264_sei.o
h264_slice.o
h264chroma.o
h264dsp.o
h264idct.o
h264pred.o
h264qpel.o
idctdsp.o
imgconvert.o
jfdctfst.o
jfdctint.o
jrevdct.o
kbdwin.o
libfdk-aacenc.o
libx264.o
mathtables.o
mdct_fixed.o
mdct_fixed_32.o
mdct_float.o
me_cmp.o
mpeg4audio.o
mpegaudiodata.o
options.o
parser.o
pixblockdsp.o
pthread.o
pthread_frame.o
pthread_slice.o
raw.o
resample.o
resample2.o
sbrdsp.o
simple_idct.o
sinewin.o
startcode.o
utils.o
videodsp.o

共计122个c文件编译的.o

同样分析ffmpeg_build_new.sh编译结果libavcodec.a
发现只有30个差别太大。
分析ffmpeg_build.sh编译结果libavcodec.a
发现有123个,和线上版本很接近。
马上对比一下文件名。仅仅是多了一个libfdk-aacdec.o

现在明白了,ffmpeg_build.sh脚本中多了一个aac解码器,原作者更改并没有保存。
立刻删除--enable-decoder=libfdk_aac 这一行。
编译通过,整个引擎也编译通过。

转载于:https://www.cnblogs.com/zzugyl/p/5439207.html

最后

以上就是阳光水池为你收集整理的记录一次Android交叉编译ffmpeg排查错误的全部内容,希望文章能够帮你解决记录一次Android交叉编译ffmpeg排查错误所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部