biezhihua / libs-build-tool

Convenient and fast library building tools
GNU General Public License v3.0
86 stars 17 forks source link

使用了有几个问题 #2

Closed TpOut closed 5 years ago

TpOut commented 5 years ago

1、生成的libsffmpeg.so 会不会因为配置项变小?(这个我会去尝试,如果你有经验可以节约我很多时间)

我目前的功能只需要录制保存(主要是编码),用lite会打出17.5m感觉有些接受不了。

2、看了下打印的日志,兼容到r19的方式应该是通过生成clang3.6和Android-21 的独立工具链吧?

感觉这样和希望的使用最新的版本,比如Android-28不太符合。

3、编译的过程中充斥这个警告

warning: unknown warning option '-Wno-psabi' [-Wunknown-warning-option]
warning: unknown warning option '-Wno-bool-operation'; did you mean '-Wno-bool-conversion'? [-Wunknown-warning-option

ps.因为我也是刚接触,所以目的可能比较理想还请见谅。 如果能解答,给下解决方法就好了,如果可以更新库就更好了,谢谢

TpOut commented 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的那个让项目先跑起来,后续再研究。 谢谢拉

biezhihua commented 5 years ago

问题: 生成的libsffmpeg.so 会不会因为配置项变小?(这个我会去尝试,如果你有经验可以节约我很多时间),我目前的功能只需要录制保存(主要是编码),用lite会打出17.5m感觉有些接受不了。

答:

配置越小,生成的so就会越小。FFmpeg是一个很重的库,基本上没有太好的办法将so压缩到很小。 参考module-min.sh打出来的so,只有10M左右。

在某些特殊情况,如:只需要解码,或只需要编码,可以参考这个文档,自行更改或者禁用一些内部lib,以达到缩减so库的目的。

http://ffmpeg.org/doxygen/trunk/modules.html

image

此外,我也再次修改了module-min.sh的配置,进一步减小so。

biezhihua commented 5 years ago

问题: 看了下打印的日志,兼容到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的平台版本。

biezhihua commented 5 years ago

问题:

warning: unknown warning option '-Wno-psabi' [-Wunknown-warning-option]

答: 已移除FFmpeg-Wno-psabi编译选项,不会再产生 '-Wno-psabi' 警告。

Note: NDK16已测试

biezhihua commented 5 years ago

问题: compile-android-ffmpeg.sh 中 sh ./android/do-compile-android-ffmpeg.sh 这句,因为后者判断有" [[ " 语法,sh不支持,需要改成bash ./android/do-compile-android-ffmpeg.sh(ubuntu环境)。

答: 已移除[[]]语法,可以测试一下,再给我反馈。

biezhihua commented 5 years ago

问题: 既然初始化可以选择armv7a,那么fork ffmpeg库的时候就不要全部abi都fork 呗。(估计是比较赶吧?既然开源了,还是希望可以写的完整一些)

答: 会在最近几天支持这个功能。

biezhihua commented 5 years ago

问题: 还有ffmpeg 里面的代码修改,比如 ffmpeg.c的最后一行,执行命令后退出要改掉也可以写入教程啊。

答: 这个我不太清楚,能再详细描述一下么。

TpOut commented 5 years ago

1、大小的问题可能我没描述清楚, 我是指同样的配置,比如module-lite里的配置项。如果用单纯configure直接编译只有4M左右,但是用这个项目的脚本编译会达到17.5M。 2、ffmpeg.c这个问题。 当项目需要执行ffmpeg的脚本命令,我看了很多教程都是需要把ffmpeg.c的最后一行,exit_program(int) 给去掉,因为这样会关闭进程,导致安卓应用也被杀死。也有把它换成ffmpeg_cleanup(int) 方法的。

biezhihua commented 5 years ago

问题:ffmpeg.c这个问题。 当项目需要执行ffmpeg的脚本命令,我看了很多教程都是需要把ffmpeg.c的最后一行,exit_program(int) 给去掉,因为这样会关闭进程,导致安卓应用也被杀死。也有把它换成ffmpeg_cleanup(int) 方法的。

答: 我看了下这个文件,这个ffmpeg.c文件应该是个可以独立运行的(其中包含main函数),这部分的改动不在该项目的支持范围内(本项目仅是自动化构建工具,帮助快速构建so,更多feature和自定义,可能需需要自行修改一些配置),如果有需要,可以自行改动repository/ffmpeg-4.1中的ffmpeg.c文件。

biezhihua commented 5 years ago

问题: 大小的问题可能我没描述清楚, 我是指同样的配置,比如module-lite里的配置项。如果用单纯configure直接编译只有4M左右,但是用这个项目的脚本编译会达到17.5M。

回复: 你用configure直接编译出来的结果,你能截图发一下么? 我看看。

TpOut commented 5 years ago

图不太好截,我直接上脚本吧。

TpOut commented 5 years ago
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"
TpOut commented 5 years ago

环境是ffmpeg4.0.2和ndk 17,结果是 libavcodec,avfilter,avformat,avutil,swresample,swscale
一共3.5M

biezhihua commented 5 years ago

@TpOut 你更新下代码,已经Fix了。 有问题再问我。