当前位置: 首页 > news >正文

编译FFmpeg4.3.1 并移植到Android app中使用(最详细的FFmpeg-Android编译教程)

文章目录

        • 1.搭建编译环境
          • 1.1 安装ubuntu14.04,安装完成后执行以下命令
          • 1.2 下载ndk
          • 1.3 下载FFmpeg n4.3.1
        • 2.编译FFmpeg
          • 1.修改configure
          • 2.配置编译脚本

1.搭建编译环境

1.1 安装ubuntu14.04,安装完成后执行以下命令

提示一下,我是在win10上面安装的子系统ubuntu,如何安装查看我这篇博客Windows10内置Linux子系统,可以直接方便的和win系统的文件直接打交道,爽!!!

安装ubuntu后,执行下面命令

apt-get update
apt-get install yasm
apt-get install pkg-config
1.2 下载ndk

这里用最新稳定版 (r21b):下载ndk-r21b
将ndk下载到 /home/ndk/目录下,下载完成后执行unzip android-ndk-r21b-linux-x86_64.zip解压

1.3 下载FFmpeg n4.3.1

下载FFmpeg n4.3.1
也可以自己选择最新版,查看最新版

下载完成后解压进入根目录,执行 ./configure --list-hwaccels,可以看到支持的硬件加速:
在这里插入图片描述
如果需要支持硬件解码,推荐看这篇文章 FFmpeg一键编译Android armv7-a arm64

2.编译FFmpeg

1.修改configure

进入源码根目录,用vim打开configure,找到

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)'  
2.配置编译脚本

在源码根目录新建build.sh,内容如下:
#号标记是我注释了的,不然会报错,因为FFmepg不包含x264解码器,需要单独编译,我没单独编译

#!/bin/bash
NDK=/home/ndk/android-ndk-r21b
ADDI_LDFLAGS="-fPIE -pie"
ADDI_CFLAGS="-fPIE -pie -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
CPU=armv7-a
ARCH=arm
HOST=arm-linux
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
PREFIX=$(pwd)/android/$CPU
#x264=$(pwd)/x264/android/$CPU
#export PATH=$x264/bin:$PATH
#export PATH=$x264/include:$PATH
#export PATH=$x264/lib:$PATH
#export PKG_CONFIG_PATH=$x264/lib/pkgconfig:$PKG_CONFIG_PATH
configure()
{
    ./configure \
    --prefix=$PREFIX \
	--toolchain=clang-usan \
    --enable-cross-compile \
    --target-os=android \
    --arch=$ARCH \
    --sysroot=$SYSROOT \
	--cc=$TOOLCHAIN/armv7a-linux-androideabi21-clang \
	--cxx=$TOOLCHAIN/armv7a-linux-androideabi21-clang++ \
    --strip=$TOOLCHAIN/arm-linux-androideabi-strip \
    --extra-cflags="$ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    --disable-encoders \
    --disable-decoders \
    --disable-avdevice \
    --disable-static \
    --disable-doc \
    --disable-ffplay \
    --disable-network \
    --disable-doc \
    --disable-symver \
	--disable-ffprobe \
	--enable-neon \
    --enable-shared \
    #--enable-libx264 \
    --enable-gpl \
    --enable-pic \
    --enable-jni \
    --enable-pthreads \
    --enable-mediacodec \
    --enable-encoder=aac \
    --enable-encoder=gif \
    --enable-encoder=libopenjpeg \
    --enable-encoder=libmp3lame \
    --enable-encoder=libwavpack \
    #--enable-encoder=libx264 \
    --enable-encoder=mpeg4 \
    --enable-encoder=pcm_s16le \
    --enable-encoder=png \
    --enable-encoder=mjpeg \
    --enable-encoder=srt \
    --enable-encoder=subrip \
    --enable-encoder=yuv4 \
    --enable-encoder=text \
    --enable-decoder=aac \
    --enable-decoder=aac_latm \
    --enable-decoder=libopenjpeg \
    --enable-decoder=mp3 \
    --enable-decoder=mpeg4_mediacodec \
    --enable-decoder=pcm_s16le \
    --enable-decoder=flac \
    --enable-decoder=flv \
    --enable-decoder=gif \
    --enable-decoder=png \
    --enable-decoder=srt \
    --enable-decoder=xsub \
    --enable-decoder=yuv4 \
    --enable-decoder=vp8_mediacodec \
    #--enable-decoder=h264_mediacodec \
    --enable-decoder=hevc_mediacodec \
    --enable-bsf=aac_adtstoasc \
    #--enable-bsf=h264_mp4toannexb \
    --enable-bsf=hevc_mp4toannexb \
    --enable-bsf=mpeg4_unpack_bframes

}

build()
{
    configure
    make clean
    make -j4
    make install
}

build

*注意 x264需要自己编译引入,ffmpeg并不包含x264
我在上面注释掉了

可以根据自己的需求对模块进行裁剪,

查看所有编译配置选项:./configure --help
查看支持的解码器:./configure --list-decoders
查看支持的编码器:./configure --list-encoders
查看支持的硬件加速:./configure --list-hwaccels

赋予脚本执行权限:chmod +x build.sh
执行脚本开始编译:./build.sh
在这里插入图片描述
在这里插入图片描述

如果一切顺利就可以在源码更目录下的android/armv7-a/lib/下找到我们需要的.so文件了
在这里插入图片描述
然后通过编译好的so可以去编译对应的QtAV,QtVLC, Opencv, 都可以,Qt-AV的编译请看我这篇博客
最新 QtAV Window or Android 环境编译以及运行

下面是我刚编译好的截图(Qt-AV):
在这里插入图片描述
刚编译好的!!!测试也是通过的

相关文章:

  • Qt for Android 动态全屏显示
  • QSS 选择器
  • Qt for android Java传递List集合对象到Qt(C/C++)
  • Qt for android 监听 android 系统 输入法的弹出消失,顶出UI等问题
  • linux centos7 升级 make 4.3
  • JS中的Map对象
  • python3 程序定时器执行(可循环),最佳有效方案
  • android studio 编译出的apk安装报错 “应用是非正式发布版本,请使用官方版本进行安装“ 解决方案
  • Android 将后台应用切换到前台
  • 如何从GitHub上下载一个项目中的单个文件或者子文件夹
  • Qt on Android 之设置应用名为中文
  • Qml 编写遥控器转盘按钮
  • Qt for android 设置应用名称国际化
  • Qt for android 静/动态权限的申请
  • c语言-------sizeof()函数讲解 (数组作为参数传递时,是否能在传递过后求该数组的大小呢?)
  • 【5+】跨webview多页面 触发事件(二)
  • 【Amaple教程】5. 插件
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 230. Kth Smallest Element in a BST
  • Angular 4.x 动态创建组件
  • ECS应用管理最佳实践
  • Hibernate最全面试题
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java程序员幽默爆笑锦集
  • Python_OOP
  • vagrant 添加本地 box 安装 laravel homestead
  • Web Storage相关
  • 配置 PM2 实现代码自动发布
  • 前端_面试
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 再谈express与koa的对比
  • 7行Python代码的人脸识别
  • ​如何防止网络攻击?
  • ​如何在iOS手机上查看应用日志
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #includecmath
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (ZT)一个美国文科博士的YardLife
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (接口封装)
  • (三) diretfbrc详解
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • .net refrector
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 的字符串暂存池
  • .net访问oracle数据库性能问题
  • .NET关于 跳过SSL中遇到的问题
  • .NET连接MongoDB数据库实例教程
  • .net网站发布-允许更新此预编译站点
  • @Autowired标签与 @Resource标签 的区别
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [2019/05/17]解决springboot测试List接口时JSON传参异常