Closed TpOut closed 5 years ago
补充描述:
1、的话,的确会因为配置变小
比如其他脚本,我目前看到比较新的是这个库ffmpeg4.0.2+ndk17c
它的配置项默认情况下,打出未合并前的7个库,总共为12.4M;加上这个库的lite里的配置项,打出来只有3.5M
因为我看脚本里好像在make install 之前基本类似,但是之后的我看不太懂,觉得是把7个库链接成一个ffmpeg。所以感觉整体上应该没有理由会保持17.5M。
2、反正有28的代码,我就直接改成android-28了。
其他建议:
目前就这么多,因为项目计划时间问题,我准备先用3.5M的那个让项目先跑起来,后续再研究。 谢谢拉
问题: 生成的libsffmpeg.so 会不会因为配置项变小?(这个我会去尝试,如果你有经验可以节约我很多时间),我目前的功能只需要录制保存(主要是编码),用lite会打出17.5m感觉有些接受不了。
答:
配置越小,生成的so就会越小。FFmpeg是一个很重的库,基本上没有太好的办法将so压缩到很小。 参考module-min.sh
打出来的so,只有10M左右。
在某些特殊情况,如:只需要解码,或只需要编码,可以参考这个文档,自行更改或者禁用一些内部lib,以达到缩减so库的目的。
http://ffmpeg.org/doxygen/trunk/modules.html
此外,我也再次修改了module-min.sh
的配置,进一步减小so。
问题: 看了下打印的日志,兼容到r19的方式应该是通过生成clang3.6和Android-21 的独立工具链吧?感觉这样和希望的使用最新的版本,比如Android-28不太符合。
答:
可能你对FF_ANDROID_PLATFORM=android-21
有什么误解,其代表的含义是当前生成的so库,最小支持的Android版本。
如果你将FF_ANDROID_PLATFORM=android-28
,那么打出来的so库,只有在28的手机上才可以运行。
如果希望使用最新的NDK和FFmpeg,直接使用本脚本编译就可以。 不用再修改内部的FF_ANDROID_PLATFORM
的平台版本。
问题:
warning: unknown warning option '-Wno-psabi' [-Wunknown-warning-option]
答:
已移除FFmpeg-Wno-psabi
编译选项,不会再产生 '-Wno-psabi' 警告。
Note: NDK16已测试
问题: compile-android-ffmpeg.sh 中 sh ./android/do-compile-android-ffmpeg.sh 这句,因为后者判断有" [[ " 语法,sh不支持,需要改成bash ./android/do-compile-android-ffmpeg.sh(ubuntu环境)。
答:
已移除[[]]
语法,可以测试一下,再给我反馈。
问题: 既然初始化可以选择armv7a,那么fork ffmpeg库的时候就不要全部abi都fork 呗。(估计是比较赶吧?既然开源了,还是希望可以写的完整一些)
答: 会在最近几天支持这个功能。
问题: 还有ffmpeg 里面的代码修改,比如 ffmpeg.c的最后一行,执行命令后退出要改掉也可以写入教程啊。
答: 这个我不太清楚,能再详细描述一下么。
1、大小的问题可能我没描述清楚, 我是指同样的配置,比如module-lite里的配置项。如果用单纯configure直接编译只有4M左右,但是用这个项目的脚本编译会达到17.5M。 2、ffmpeg.c这个问题。 当项目需要执行ffmpeg的脚本命令,我看了很多教程都是需要把ffmpeg.c的最后一行,exit_program(int) 给去掉,因为这样会关闭进程,导致安卓应用也被杀死。也有把它换成ffmpeg_cleanup(int) 方法的。
问题:ffmpeg.c这个问题。 当项目需要执行ffmpeg的脚本命令,我看了很多教程都是需要把ffmpeg.c的最后一行,exit_program(int) 给去掉,因为这样会关闭进程,导致安卓应用也被杀死。也有把它换成ffmpeg_cleanup(int) 方法的。
答:
我看了下这个文件,这个ffmpeg.c文件应该是个可以独立运行的(其中包含main函数),这部分的改动不在该项目的支持范围内(本项目仅是自动化构建工具,帮助快速构建so,更多feature和自定义,可能需需要自行修改一些配置),如果有需要,可以自行改动repository/ffmpeg-4.1
中的ffmpeg.c
文件。
问题: 大小的问题可能我没描述清楚, 我是指同样的配置,比如module-lite里的配置项。如果用单纯configure直接编译只有4M左右,但是用这个项目的脚本编译会达到17.5M。
回复: 你用configure直接编译出来的结果,你能截图发一下么? 我看看。
图不太好截,我直接上脚本吧。
NDK=/home/tpout/Downloads/android-ndk-r17c
SYSROOT="$NDK/sysroot"
HOST="linux-x86_64"
LLVM_TOOLCHAIN="$NDK/toolchains/llvm/prebuilt/$HOST/bin"
IS_CLANG=1
CFLAGS="-O3 -fPIC"
LDFLAGS="-lc"
for i in "$@"; do
case $i in
-t=*|--toolchain=*)
EXTENSION="${i#*=}"
if [ $EXTENSION = "gcc" ]; then
IS_CLANG=0
fi
shift
;;
*)
# unknown option
;;
esac
done
build () {
ARCH=$1
LEVEL=$2
CONFIGURATION="--disable-asm --enable-cross-compile --disable-static --disable-programs --disable-doc --enable-shared --enable-protocol=file --enable-pic --enable-small $3"
LIB_FOLDER="lib"
case $ARCH in
"armeabi-v7a")
TARGET="arm-linux-androideabi"
if [ $IS_CLANG = 1 ]; then
CC_FLAGS="-target thumbv7-none-linux-androideabi -mfpu=vfpv3-d16 -mfloat-abi=soft"
else
CC_FLAGS="-mfpu=vfpv3-d16 -mfloat-abi=soft"
fi
LDFLAGS="--fix-cortex-a8 $LDFLAGS"
PLATFORM_ARCH="arm"
TOOLCHAIN_FOLDER=$TARGET
;;
esac
TOOLCHAIN=$NDK/toolchains/$TOOLCHAIN_FOLDER-4.9/prebuilt/$HOST/bin
if [ $IS_CLANG = 1 ]; then
CC=$LLVM_TOOLCHAIN/clang
CXX=$LLVM_TOOLCHAIN/clang++
AS=$CC
else
CC=$TOOLCHAIN/$TARGET-gcc
CXX=$TOOLCHAIN/$TARGET-g++
AS=$TOOLCHAIN/$TARGET-as
fi
AR=$TOOLCHAIN/$TARGET-ar
LD=$TOOLCHAIN/$TARGET-ld
STRIP=$TOOLCHAIN/$TARGET-strip
PREFIX="android/$ARCH"
./configure --prefix=$PREFIX \
$CONFIGURATION \
--disable-gpl \
--disable-nonfree \
--enable-runtime-cpudetect \
--disable-gray \
--disable-swscale-alpha \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-htmlpages \
--disable-manpages \
--disable-podpages \
--disable-txtpages \
--disable-avdevice \
--enable-avcodec \
--enable-avformat \
--enable-avutil \
--enable-swresample \
--enable-swscale \
--disable-postproc \
--enable-avfilter \
--disable-avresample \
--disable-network \
--disable-d3d11va \
--disable-dxva2 \
--disable-vaapi \
--disable-vdpau \
--disable-videotoolbox \
--disable-encoders \
--enable-encoder=png \
--disable-decoders \
--enable-decoder=aac \
--enable-decoder=aac_latm \
--enable-decoder=flv \
--enable-decoder=h264 \
--enable-decoder=mp3* \
--enable-decoder=vp6f \
--enable-decoder=flac \
--enable-decoder=vp8 \
--enable-decoder=vp9 \
--disable-hwaccels \
--disable-muxers \
--enable-muxer=mp4 \
--disable-demuxers \
--enable-demuxer=aac \
--enable-demuxer=concat \
--enable-demuxer=data \
--enable-demuxer=flv \
--enable-demuxer=hls \
--enable-demuxer=live_flv \
--enable-demuxer=mov \
--enable-demuxer=mp3 \
--enable-demuxer=mpegps \
--enable-demuxer=mpegts \
--enable-demuxer=mpegvideo \
--enable-demuxer=flac \
--enable-demuxer=webm_dash_manifest \
--disable-parsers \
--enable-parser=aac \
--enable-parser=aac_latm \
--enable-parser=h264 \
--enable-parser=flac \
--enable-bsfs \
--disable-bsf=chomp \
--disable-bsf=dca_core \
--disable-bsf=dump_extradata \
--disable-bsf=hevc_mp4toannexb \
--disable-bsf=imx_dump_header \
--disable-bsf=mjpeg2jpeg \
--disable-bsf=mjpega_dump_header \
--disable-bsf=mov2textsub \
--disable-bsf=mp3_header_decompress \
--disable-bsf=mpeg4_unpack_bframes \
--disable-bsf=noise \
--disable-bsf=remove_extradata \
--disable-bsf=text2movsub \
--disable-bsf=vp9_superframe \
--enable-protocols \
--enable-protocol=async \
--disable-protocol=bluray \
--disable-protocol=concat \
--disable-protocol=crypto \
--disable-protocol=ffrtmpcrypt \
--enable-protocol=ffrtmphttp \
--disable-protocol=gopher \
--disable-protocol=icecast \
--disable-protocol=librtmp* \
--disable-protocol=libssh \
--disable-protocol=md5 \
--disable-protocol=mmsh \
--disable-protocol=mmst \
--disable-protocol=rtmp* \
--enable-protocol=rtmp \
--enable-protocol=rtmpt \
--disable-protocol=rtp \
--disable-protocol=sctp \
--disable-protocol=srtp \
--disable-protocol=subfile \
--disable-protocol=unix \
--disable-devices \
--disable-filters \
--disable-iconv \
--disable-audiotoolbox \
--disable-videotoolbox \
--disable-linux-perf \
--disable-bzlib \
--ar=$AR --strip=$STRIP --ld=$LD --cc=$CC --cxx=$CXX --as=$AS \
--target-os=android \
--extra-cflags="$CC_FLAGS -I$SYSROOT/usr/include/$TARGET $CFLAGS" \
--extra-ldflags="-L$NDK/toolchains/$TOOLCHAIN_FOLDER-4.9/prebuilt/$HOST/lib/gcc/$TARGET/4.9.x -L$NDK/platforms/android-$LEVEL/arch-$PLATFORM_ARCH/usr/$LIB_FOLDER $LDFLAGS" \
--sysroot=$SYSROOT --extra-libs=-lgcc
$NDK/prebuilt/$HOST/bin/make clean
$NDK/prebuilt/$HOST/bin/make -j2
$NDK/prebuilt/$HOST/bin/make install
}
build "armeabi-v7a" "28"
环境是ffmpeg4.0.2和ndk 17,结果是
libavcodec,avfilter,avformat,avutil,swresample,swscale
一共3.5M
@TpOut 你更新下代码,已经Fix了。 有问题再问我。
1、生成的libsffmpeg.so 会不会因为配置项变小?(这个我会去尝试,如果你有经验可以节约我很多时间)
我目前的功能只需要录制保存(主要是编码),用lite会打出17.5m感觉有些接受不了。
2、看了下打印的日志,兼容到r19的方式应该是通过生成clang3.6和Android-21 的独立工具链吧?
感觉这样和希望的使用最新的版本,比如Android-28不太符合。
3、编译的过程中充斥这个警告
ps.因为我也是刚接触,所以目的可能比较理想还请见谅。 如果能解答,给下解决方法就好了,如果可以更新库就更好了,谢谢