美文网首页
ffmpeg(一)——编译库

ffmpeg(一)——编译库

作者: 王志强_9380 | 来源:发表于2020-06-29 15:14 被阅读0次

    库文件简介

    Libavcodec

    音频编解码器

    Libavutil

    数学函数
    字符串操作
    内存管理相关
    数据结构相关
    错误码及错误处理
    日志输出
    其他辅助信息,比如密钥、哈希值、宏、库版本、常量等

    Libavformat

    包含多媒体容器格式的解复用器和复用器,常见的mp4等都是通过这个来进行格式封装

    Libavdevice

    包含输入输出设备,对常用格式的实现

    Libavfilter

    多媒体过滤器库

    Libswscale

    高度图像缩放

    Libswresample

    音视频重采样工具

    ndk环境配置

    下载NDK:https://developer.android.google.cn/ndk/downloads/
    需要下载旧版本的:https://developer.android.google.cn/ndk/downloads/older_releases.html

    我们这里下载android-ndk-r17c-linux-x86_64.zip

    可以把地址复制到Linux中通过命令 wget 下载

    解压ndk:

    unzip android-ndk-r17c-linux-x86_64.zip 
    

    在ndk目录使用命令获取到ndk路径:

    pwd 
    /home/wzq/work/WZQ/ndk/android-ndk-r17c
    

    配置环境:

    sudo vim /etc/profile
    

    在最后加入

    NDKROOT=/home/wzq/work/WZQ/ndk/android-ndk-r17c
    export PATH=$NDKROOT:$PATH
    

    保存文件

    执行命令:

    source /etc/profile 
    

    使配置生效

    输入

    ndk-build
    

    输出

    Android NDK: Could not find application project directory !    
    Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    
    /home/wzq/work/WZQ/ndk/android-ndk-r17c/build/core/build-local.mk:151: *** Android NDK: Aborting    .  Stop.
    

    表示NDK环境配置成功了

    ffmpeg源文件下载和编译

    下载地址:https://www.ffmpeg.org/download.html
    或者:https://ffmpeg.org/releases/
    我们需要下载Linux下的,我们这里下载 ffmpeg-4.1.4.tar.bz2,最新版本的ffmpeg-4.2.1编译后找不到生成的文件在哪里

    解压文件

     tar -jxvf ffmpeg-4.1.4.tar.bz2
    

    进入到目录中,找到一个configure文件,这个文件是一个shell脚本,可以直接执行

    ./configure
    

    输出

    nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
    
    If you think configure made a mistake, make sure you are using the latest
    version from Git.  If the latest version fails, report the problem to the
    ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
    Include the log file "ffbuild/config.log" produced by configure as this will help
    solve the problem.
    

    看到,编译ffmpeg需要传入一些参数

    ./configure --disable-x86asm
    

    这样ffmpeg就编译完了,但是这个编译出来的库只能运行在Linux
    要编译出能够在android环境中执行的库,需要加入一些编译参数
    这里把编译命令做成了一个shell脚本:build.sh

    #!/bin/bash
    NDK_ROOT=/home/wzq/work/WZQ/ndk/android-ndk-r17c
    #TOOLCHAIN 变量指向ndk中的交叉编译gcc所在的目录
    TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/
    #FLAGS与INCLUDES变量 可以从AS ndk工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷贝,需要注意的是**地址**
    FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11  -O0 -fPIC"
    INCLUDES="-isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++/include -isystem $NDK_ROOT/sources/android/support/include -isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include"
    
    #执行configure脚本,用于生成makefile
    #--prefix : 安装目录
    #--enable-small : 优化大小
    #--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。
    #--disable-avdevice : 关闭avdevice模块,此模块在android中无用
    #--disable-encoders : 关闭所有编码器 (播放不需要编码)
    #--disable-muxers :  关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭
    #--disable-filters :关闭视频滤镜
    #--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 )
    #--cross-prefix: 看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx-
    #disable-shared enable-static 不写也可以,默认就是这样的。
    #--sysroot: 
    #--extra-cflags: 会传给gcc的参数
    #--arch --target-os :
    PREFIX=$(pwd)/android/armeabi-v7a2
    ./configure \
    --prefix=$PREFIX \
    --prefix=$PREFIX \
    --enable-small \
    --disable-programs \
    --disable-avdevice \
    --disable-encoders \
    --disable-muxers \
    --disable-filters \
    --enable-cross-compile \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --disable-shared \
    --enable-static \
    --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
    --extra-cflags="$FLAGS $INCLUDES" \
    --extra-cflags="-isysroot $NDK_ROOT/sysroot" \
    --arch=arm \
    --target-os=android 
    
    make clean
    make install
    

    执行这个脚本

    /bin/bash ./build.sh
    

    生成的静态库在./android/armeabi-v7a2中

    相关文章

      网友评论

          本文标题:ffmpeg(一)——编译库

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