ffmpeg编译与集成到android

Fmpeg 有六个常用的功能模块:

  • libavformat:多媒体文件或协议的封装和解封装库,如 Mp4、Flv 等文件封装格式,RTMP、RTSP 等网络协议封装格式;
  • libavcodec:音视频编解码库;
  • libavfilter:音视频、字幕滤镜库;
  • libswscale:图像格式转换库;
  • libswresample:音频重采样库;
  • libavutil:工具库;

编译准备:

  1. center os 服务器
  2. 下载FFmpeg 4.3.1
  3. 下载android-ndk-r20b-linux-x86_64, 设置环境变量

手动搭建FTP站点(CentOS 8)

https://help.aliyun.com/document_detail/182263.html?spm=a2c4g.11186623.6.1232.fdf02ffbzrs5lB

环境

  1. 下载ffmpeg文件(linux下载不下来 我本地下载上传到github 在clone下来的)
https://gitee.com/liudao/AudioRecodeDemo.git

git clone https://gitee.com/liudao/AudioRecodeDemo.git
  1. 解压
    tar -jxvf ffmpeg-4.3.1.tar.bz2

tar解压bz2包--tar (child): bzip2:无法 exec: 没有那个文件或目录

原因:缺少bzip2包

yum install -y bzip2

配置项目

./configure --disable-x86asm

ndk配置

创建目录

在usr目录下创建 android文件夹

mkdir android

下载NDK

这个是r20b 的下载地址.

https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip

解压

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

安装unzip

yum install -y unzip zip

路径

/usr/android/ndk/android-ndk-r20b

FFmpeg 4.3.1 解压目录下创建编译脚本 build_android_arm64-v8a_clang.sh

 vim build_android_arm64-v8a_clang.sh

修改ffmpeg配置文件

找到configure 文件

1、添加--cross-prefix-clang

--cross-prefix=PREFIX  use PREFIX for compilation tools [$cross_prefix]
  # 这里添加
--cross-prefix-clang=PREFIX use PREFIX for compilation clang tools [$cross_prefix]
--progs-suffix=SUFFIX  program name suffix []

2、CMDLINE_SET 新增变量

CMDLINE_SET="
    $PATHS_LIST
    ar
    arch
    as
    assert_level
    build_suffix
    cc
    objcc
    cpu
    cross_prefix
    # 这里增加
    cross_prefix_clang
    custom_allocator
    cxx
    dep_cc
    doxygen
    env

3、修改 clang++ 编译的默认值

set_default target_os
if test "$target_os" = android; then
    cc_default="clang"
    # 这里新增
    cxx_default="clang++"
fi

ar_default="${cross_prefix}${ar_default}"
# 这里新增
cc_default="${cross_prefix_clang}${cc_default}"
# 这里新增
cxx_default="${cross_prefix_clang}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
if ${cross_prefix}${ranlib_default} 2>&1 | grep -q "\-D "; then
    ranlib_default="${cross_prefix}${ranlib_default} -D"
else
    ranlib_default="${cross_prefix}${ranlib_default}"
fi

编译脚本1 armv7-a

#!/bin/bash
NDK=/usr/dev/ndk/android-ndk-r20b

function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
    --prefix=$PREFIX \
    --enable-neon \
    --enable-hwaccels \
    --enable-gpl \
    --enable-postproc \
    --enable-shared \
    --enable-jni \
    --enable-mediacodec \
    --enable-decoder=h264_mediacodec \
    --disable-static \
    --disable-doc \
    --enable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --enable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC \
    --cxx=$CXX \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed 编译成功"
}

#armv7-a
ARCH=arm
CPU=armv7-a
API=21
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot  
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android

编译脚本 2

#!/bin/bash

#这里配置先你的 NDK 路径
export NDK=/usr/android/android-ndk-r20b 

echo "Compiling FFmpeg for $CPU"

function build_android
{

./configure \
--prefix=$PREFIX \
--enable-neon  \
--enable-hwaccels  \
--enable-gpl   \
--enable-postproc \
--disable-debug \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--disable-static \
--enable-shared \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--enable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \

make clean
# 这里是定义用几个CPU编译
make -j4
make install

echo "============================ build android arm64-v8a success =========================="

}

#arm64-v8a
ARCH=arm64
CPU=armv8-a
API=21
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"

build_android

 ```

执行脚本 我用的是v7 的 32位 有需要64位的再编译64位的

# 修改 build_android_arm64-v8a_clang.sh 可执行权限
chmod +x build_android_arm64-v8a_clang.sh
# 运行编译脚本
./build_android_arm64-v8a_clang.sh
结果:
![](https://liudao01.github.io/picture/img/企业微信截图_719ae0fe-db11-444c-9f55-4745a8da3e2d.png)

## 解析:
--prefix=$PREFIX \  文件输出位置
--enable-neon \    NEON优化
--enable-hwaccels \  全部的硬件加速
--enable-gpl \  允许使用GPL
--enable-postproc \  postproc用于后期效果处理
--enable-shared \  启用共享库
--enable-jni \   启用JNI支持
--enable-mediacodec \  启用安卓MediaCodec支持
--enable-decoder=h264_mediacodec \  启用指定的解码器 h264
--disable-static \  禁止静态库
--disable-doc \  禁止生成doc文件
--enable-ffmpeg \
--disable-ffplay \  ffplay播放器
--disable-ffprobe \
--enable-small    使用--enable-small选项。能减掉大约3M的体积,从5M到大概1.94M(ffmpeg 1.0). 对于--enable-small,这个优化其实是牺牲编码解码速度来换取动态库的瘦身,对于硬盘或者内存不是那么紧迫的应用,完全可以不打开。
--enable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \ 指定处理器
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \ 使能交叉编译
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG

extra-ldflags= 用于指定第三方库位置
make -j16  用于加速编译的参数
--extra-cflags  用于编译的时候指定第三方库位置.
-mfloat-abi=softfp -mfpu=vfp -marm  
“soft”选项:表明不使用FPU硬件,而是使用GCC的整数算术运算来模拟浮点运算。
“softfp”选项:表明要使用FPU硬件来做浮点运算,只是,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到FPU中
“hard”选项:表明要使用FPU硬件来做浮点运算,并且,函数的参数直接传递到FPU的寄存器(s0、d0)中。
用-mfloat-abi=soft编译的app或者库,在用-mfloat-abi=softfp编译的OS中是可以跑的;
用-mfloat-abi=softfp编译的app或者库,在用-mfloat-abi=soft编译的OS中,如果SoC中没有FPU,那么是不能跑的。
而-mfloat-abi=softfp/soft与-mfloat-abi=hard,是互不兼容的。

--disable-avdevice disable libavdevice build == 模块之一(可以操控我们的摄像头-(Android中是不支持))
--disable-avcodec disable libavcodec build == audio video codec(编码 和 解码)
--disable-avformat disable libavformat build == 音视频格式生成和解析相关
--disable-swresample disable libswresample build == 音频 重采样(如果想把单声道,变成双声道)
--disable-swscale disable libswscale build == 对视频显示相关(对视频的缩放,放大 缩小)
--disable-postproc disable libpostproc build == 后期处理,很少用,可以关闭掉
--disable-avfilter disable libavfilter build == 给视频加水印,加字幕,特殊效果


其他参数解析文章参数解析

https://juejin.cn/post/6844904052807958536

# 集成FFMPEG

项目地址: https://github.com/liudao01/XYMusic/tree/main/ffmpegInclude
六道对穿肠的学习之旅,作手新一的学习之旅
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇