美文网首页
ffmpeg动态so库生成

ffmpeg动态so库生成

作者: 默默_大魔王 | 来源:发表于2019-12-04 18:14 被阅读0次

    引言

    最近学习ffmpeg,要用到ffmpeg的动态库,于是网上扒,看到csdn上需要50积分才能下载,因为安卓只能用so库,还有.a静态库,所以决定自己动手搞搞,windows上也可以生成动态库,不过过程比较曲折,问题比较多,我是弄了一半,又决定安装linux虚拟机,这个动态库搞了一天,做个笔记。
    第一步:安装虚拟机
    第二步:下载ndk,配置环境变量
    第三步:下载ffmpeg,新建android_build.sh脚本,并且编写脚本来生成so
    完事,这么简单为啥搞了一天?中间遇到很多问题,包括环境变量的配置,shell脚本的编写,以下记录艰难的过程。

    首先在虚拟机上下载ndk,开始下载的高版本,遇到问题,建议用14版本的,开始还不信,下载了20,后来又改了19,最最后还是改回了14,下载地址
    android-ndk-r14b

    环境变量要配置好

    vim ~/.bashrc,按i进入编辑,
    export NDKHOME=/home/json_wu/ffmpeg/android-ndk-r14b (自己的路径)
    export PATH=NDKHOME:NDKHOME:PATH
    按下ESC退出编辑,再按下冒号,wq命令修改保存退出
    测试命令 ndk_build

    下载ffmpeg

    ffmpeg下载地址
    安装中遇到个问题,才安装了这个,可选,还有一个gcc的东西,怕遇到问题都要提前装好

    并且修改ffmpeg下的confinure代码

    #SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    #LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    #SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    #SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
    /*修改为*/
    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'
    
    

    新建android_build.sh,以下是android_build.sh生成arm的shell脚本,只能生成arm的ffmpeg的动态库,动态库include和lib下载地址:

    链接: https://pan.baidu.com/s/1a_-1U5mvpO_yPGFjwC2UXQ 提取码: yhrv

    image.png

    android_build.sh脚本原码

    #!/bin/bash
    . /etc/profile
    function build
    {
        echo "start build ffmpeg for $ARCH"
        ./configure --target-os=linux \
        --prefix=$PREFIX --arch=$ARCH \
        --disable-doc \
        --enable-shared \
        --disable-static \
        --disable-yasm \
        --disable-asm \
        --disable-symver \
        --enable-gpl \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --cross-prefix=$CROSS_COMPILE \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --enable-small \
        --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
        make clean
        make
        make install
        echo "build ffmpeg for $ARCH finished"
    }
    
    ARCH=arm
    CPU=arm
    PREFIX=$(pwd)/android/$ARCH
    TOOLCHAIN=$NDK_PATH/android-toolchains/arm-19
    CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
    ADDI_CFLAGS="-marm"
    SYSROOT=$TOOLCHAIN/sysroot
    build
    
    各种库的作用介绍

    libavcodec:提供了一个通用的编码/解码框架包含多种音解码器和编码器,视频和字幕流,和几个比特流过滤器。共享体系结构提供了各种各样的服务,从比特流I/O到DSP优化,使得它适合于实现健壮和快速的编解码器,以及用于实验。

    libformat:提供了视频的复用和多路处理功能。实现了流媒体协议(udp、rtp、rtmp、rtsp等),媒体容器(mp4、AVI、Flv等)和基本的I/O访问。

    libavutil:是一个实用程序库,以帮助便携式多媒体编程。它包含了安全的移动字符串函数,随机数生成器,数据结构,附加数学功能,加密和多媒体相关的功能(如枚举的像素采样格式)。它并不是libavcodec和libav必备的库

    libavdevice:抓取和绘制多种多媒体输入/输出设备提供了一个通用的框架,支持多种输入和输出设备,包括video4linux2 vfw dshow ALSA。

    libavfilter:是一个通用的音视频后处理库。例如噪音处理

    libswcale:执行高度优化的图像缩放和颜色的像素格式转换操作。
    具体来说,这个库执行以下操作:
    缩放:是改变视频大小的过程。几种缩放选项和算法都可以。这通常是一个有损过程。
    像素格式转换:是图像的图像格式和色彩空间转换的过程,例如从平面yuv420p为RGB24包装。它还处理包装转换,即从填充布局(所有属于同一缓冲区内的不同平面的像素)转换为平面布局(所有属于同一平面的样本都存储在专用缓冲区或“平面”)中。
    这通常是在源和目标颜色不同的有损压缩。

    libswresample:实现音频的重采样和混音,根据平台做了优化(neon等)。
    该libswresample库进行高度优化的音频采样,rematrixing和采样格式转换操作。
    重采样:是改变音频速率,例如从44100Hz的高采样率到8000Hz的过程。从高至低采样率的音频转换是一种有损的过程。几个重采样选项和算法是可用的。
    格式转换:是将样品的类型,例如从16位有符号的样本为无符号的8位或浮样品的过程。它还处理包装的转换,从包装的布局传递时,以平面布局(属于交织在相同缓冲液不同的信道的所有样品)(属于存储在专用缓冲区或“平面”相同的信道的所有样品)。
    Rematrixing:是改变频道布局,例如从立体声到单声道的过程。当输入通道不能被映射到输出数据流,该方法是有损耗的,因为它涉及到不同的增益因子和混合。
    其他各种音频转换(如拉伸和填充)通过专用的选项启用。
    动态库的使用请看这里

    相关文章

      网友评论

          本文标题:ffmpeg动态so库生成

          本文链接:https://www.haomeiwen.com/subject/mrxlgctx.html