FFmpeg(一)动态so库生成

引言

最近学习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库生成)