编译FFmpeg4.3.1 、x264并移植到Android

1、前言

FFmpeg 既是一款音视频编解码工具,同时也是一组音视频编解码开发套件。

2、准备工作

  • 系统:Linux
  • NDK:android-ndk-r21b-linux-x86_64.zip
  • FFmpeg:ffmpeg-snapshot.tar.bz2
  • x264:x264

3、下载NDK 在linux环境中,使用命令如下:
 

#1.进入用户目录
cd /usr#2.新建一个android文件夹用来存放ndk
mkdir android
cd /android#3.下载ndk
wget https://dl.google.com/android/repository/android-ndk-r21b-linux-x86_64.zip#4.安装解压工具
yum -y install unzip#5.解压ndk
unzip android-ndk-r21b-linux-x86_64.zip

4、下载FFmpeg

#1.进入用户目录
cd /usr#2.新建一个ffmpeg文件夹用来存放ffmpeg
mkdir ffmpeg
cd /ffmpeg#3.下载ffmpeg
wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2#4.解压ffmpeg
tar -xf ffmpeg-snapshot.tar.bz2

5、下载x264

#1.进入用户目录
cd /usr#2.新建一个x264文件夹用来存放x264
mkdir x264
cd /x264#3.下载x264
wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2#4.解压x264
tar -xf x264-master.tar.bz2

6、开始编译x264

#1.进入x264解压之后的目录
cd /x264-master#2.新建一个编译脚本build_x264_android-v7a.sh
vim build_x264_android-v7a.sh#3.执行build_x264_android-v7a.sh
sh build_x264_android-v7a.sh#4.命令执行成功后会后如下内容
cd /android/armeabi-v7a#头文件-include
-rw-r--r--. 1 root root   172 Sep 18 03:01 x264_config.h
-rw-r--r--. 1 root root 47960 Sep 18 03:01 x264.h
#静态库-lib
-rw-r--r--. 1 root root 1820080 Sep 18 03:01 libx264.a
drwxr-xr-x. 2 root root      21 Sep 18 03:01 pkgconfig

build_x264_android-v7a.sh内容如下:

#!/bin/bashecho ">>>>>>>>> 编译x264 android-v7a <<<<<<<<"# 你的ndk路径,如果你是按照以上步骤来的,此处可以不用修改
export NDK=/usr/android/android-ndk-r21b export HOST_TAG=linux-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG#C、C++编译器
export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang # c compiler path
export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++ # c++ compiler path#编译结果存放目录
PREFIX=$(pwd)/android/armeabi-v7afunction build_android
{
#如果你需要的是动态库,--enable-static 改为 --enable-sharedecho ">>>>>>>>开始编译<<<<<<<<<<"./configure \--prefix=$PREFIX \--enable-static \--enable-pic \--disable-asm \--disable-opencl \--disable-cli \--host=arm-linux \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--sysroot=$TOOLCHAIN/sysroot \make cleanmakemake installecho ">>>>>>编译完成!<<<<<<"
}build_android

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

7、开始编译FFmpeg并依赖x264

#1.进入ffmpeg解压之后的目录
cd /ffmpeg#2.新建一个编译脚本build_ffmpeg_with_x264.sh
vim build_ffmpeg_with_x264.sh#3.执行build_ffmpeg_with_x264.sh,如果提示缺少xxx.mak,则先执行一下./configure,然后继续
sh build_ffmpeg_with_x264.sh#4.命令执行成功后会有如下内容
cd /android/armv7-adrwxr-xr-x. 2 root root  20 Sep 18 19:54 bin
drwxr-xr-x. 9 root root 137 Sep 18 19:54 include
drwxr-xr-x. 3 root root 214 Sep 18 20:00 lib
drwxr-xr-x. 3 root root  20 Sep 18 19:54 share#头文件
cd /include
drwxr-xr-x. 2 root root 4096 Sep 18 19:54 libavcodec
drwxr-xr-x. 2 root root   80 Sep 18 19:54 libavfilter
drwxr-xr-x. 2 root root   55 Sep 18 19:54 libavformat
drwxr-xr-x. 2 root root 4096 Sep 18 19:54 libavutil
drwxr-xr-x. 2 root root   44 Sep 18 19:54 libpostproc
drwxr-xr-x. 2 root root   43 Sep 18 19:54 libswresample
drwxr-xr-x. 2 root root   40 Sep 18 19:54 libswscale#静态库
cd /lib
-rw-r--r--. 1 root root 11900662 Sep 18 19:54 libavcodec.a
-rw-r--r--. 1 root root  3672928 Sep 18 19:54 libavfilter.a
-rw-r--r--. 1 root root  3425150 Sep 18 19:54 libavformat.a
-rw-r--r--. 1 root root   531514 Sep 18 19:54 libavutil.a
-rw-r--r--. 1 root root    28484 Sep 18 19:54 libpostproc.a
-rw-r--r--. 1 root root    98088 Sep 18 19:54 libswresample.a
-rw-r--r--. 1 root root   445110 Sep 18 19:54 libswscale.a
drwxr-xr-x. 2 root root      158 Sep 18 19:54 pkgconfig

build_ffmpeg_with_x264.sh脚本内容:

#!/bin/bashecho ">>>>>>>>> 编译ffmpeg <<<<<<<<"#NDK路径.
export NDK=/usr/android/android-ndk-r21b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64#如果只需要单独的ffmpeg,不需要依赖x264,去掉$ADD_H264_FEATURE这句就可以了;
#如果你需要的是动态库,--enable-static 改为 --disable-static,--disable-shared 改为 --enable-sharedfunction build_android
{echo "开始编译 $CPU"./configure \
--prefix=$PREFIX \
--enable-neon  \
--enable-hwaccels  \
--enable-gpl   \
--enable-postproc \
--disable-shared \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-static \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-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"
$ADD_H264_FEATUREmake clean
make
make installecho "编译完成 $CPU"}#x264库所在的位置,ffmpeg 需要链接 x264
LIB_DIR=/usr/x264/x264-master/android/armeabi-v7a;#x264的头文件地址
INC="$LIB_DIR/include"#x264的静态库地址
LIB="$LIB_DIR/lib"ADD_H264_FEATURE="--enable-encoder=aac \--enable-decoder=aac \--enable-gpl \--enable-encoder=libx264 \--enable-libx264 \--extra-cflags=-I$INC \--extra-ldflags=-L$LIB "
#armv7-a
ARCH=arm
CPU=armv7-a
API=21
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

8、合并编译出来的静态库为一个单独的libffmpeg.so

#1.进入ffmpeg静态库目录
cd android/armv7-a/lib/
#2.新建union_ffmpeg_so.sh
vim union_ffmpeg_so.sh
#3.执行union_ffmpeg_so.sh
sh union_ffmpeg_so.sh
#4.执行成功后会看到如下内容
-rwxr-xr-x. 1 root root 17863896 Sep 18 20:00 libffmpeg.so

union_ffmpeg_so.sh脚本内容如下:

echo "开始编译ffmpeg so"#NDK路径.
export NDK=/usr/android/android-ndk-r21bPLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64PREFIX=$(pwd)#如果不需要依赖x264,去掉/usr/x264/x264-master/android/armeabi-v7a/lib/libx264.a \就可以了$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$PLATFORM/usr/lib \
-L$PLATFORM/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \libavcodec.a \libavfilter.a \libswresample.a \libavformat.a \libavutil.a \libpostproc.a \libswscale.a \/usr/x264/x264-master/android/armeabi-v7a/lib/libx264.a \-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \echo "完成编译ffmpeg so"

9、移植编译的libffmpeg.so及头文件到Androidstudio项目中步骤如下:

1.新建一个native项目,然后进行如下配置

2.配置build.gradle,如果你是按照我这样在module中导入的ffmpeg,则在app-build.gradle需要添加 ndk{ abiFilters 'armeabi-v7a' }

3.新建andr_ffmpeg.cpp

4.新建AndrFFmpeg.java

5.调用AndrFFmpeg->getFFmpegVersion()、AndrFFmpeg.getAVCodeInfo()

10、如有遗漏、错误的地方欢迎指正、拍砖~~~~

原文链接 编译FFmpeg4.3.1 、x264并移植到Android

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/633067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hanlp,pkuseg,jieba,cutword分词实践

总结&#xff1a;只有jieba,cutword,baidu lac成功将色盲色弱成功分对,这两个库字典应该是最全的 hanlp[持续更新中] https://github.com/hankcs/HanLP/blob/doc-zh/plugins/hanlp_demo/hanlp_demo/zh/tok_stl.ipynb import hanlp # hanlp.pretrained.tok.ALL # 语种见名称最…

RabbitMQ交换机(3)-Topic

1.Topic模式 RabbitMQ的Topic模式是一种基于主题的消息传递模式。它允许发送者向一个特定的主题&#xff08;topic&#xff09;发布消息&#xff0c;同时&#xff0c;订阅者也可以针对自己感兴趣的主题进行订阅。 在Topic模式中&#xff0c; 主题通过一个由单词和点号组成的字…

Git教程学习:07 打标签

文章目录 0 前言1 列出标签2 创建标签3 附注标签4 轻量标签5 后期打标签6 共享标签7 删掉标签8 检查标签 0 前言 像其他版本控制系统&#xff08;VCS&#xff09;一样&#xff0c;Git 可以给仓库历史中的某一个提交打上标签&#xff0c;以示重要。 比较有代表性的是人们会使用…

Unity使用Protobuf

1.下载Protobuf ProtoBuf 2.打开它并且编译 如果有报错下载相应的.net版本即可 这里默认是6.0.100 由于我本机是8.0.100所以我改了这个文件 3.编译后的文件复制到Unity Assets/Plugins下 4.写个测试的proto文件 5.然后使用protoc生成 这里实现了一个简单的bat批量生成 Protos C…

微软与沃达丰签订10年合作,提供Copilot等生成式AI服务

1月16日&#xff0c;微软在官网宣布&#xff0c;与全球最大电信公司之一沃达丰&#xff08;Vodafone&#xff09;签订10年合作协议&#xff0c;将为3亿多企业、消费者提供生成式AI、云和数字服务等。 通过此次合作&#xff0c;沃达丰将利用微软的Copilot等生成式AI来改变客户、…

新版AndroidStudio dependencyResolutionManagement出错

在新版AndroidStudio中想像使用4.2版本或者4.3版本的AndroidStudio来构造项目&#xff1f;那下面这些坑我们就需要来避免了&#xff0c;否则会出各种各样的问题。 一.我们先来看看新旧两个版本的不同。 1.jdk版本的不同 新版默认是jdk17 旧版默认是jdk8 所以在新版AndroidSt…

FlinkAPI开发之状态管理

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 Flink中的状态 概述 有状态的算子 状态的分类 托管状态&#xff08;Managed State&#xff09;和原始状态&…

如何用GPT进行数据处理?

详情点击链接&#xff1a;如何用GPT进行数据处理&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己…

线性代数基础【5】特征值和特征向量

第五章 特征值和特征向量 第一节、特征值和特征向量的基本概念 一、特征值和特征向量的理论背景 在一个多项式中,未知数的个数为任意多个,且每一项次数都是2的多项式称为二次型,二次型分为两种类型:即非标准二次型及标准二次型 注意: ①二次型X^T AX为非标准二次型的充分必…

docker部署项目,/var/lib/docker/overlay2目录满了如何清理?

docker部署项目&#xff0c;/var/lib/docker/overlay2目录满了如何清理&#xff1f; 一、问题二、解决1、查看 /var/lib/docker 目录&#xff08;1&#xff09;、containers 目录&#xff08;2&#xff09;、volumes 目录&#xff08;3&#xff09;、overlay2 目录 2、清理&…

总结1094

昨天又摆烂了&#xff0c;总结后面补的。 记录一个as中的错误&#xff1a; 一年没碰android了&#xff0c;下载安装AS,发现出现Gradle问题&#xff1a; ERROR: Connection timed out: connect&#xff1a;错误:连接超时:连接 这个错误 一般来说是因为.gradle引起的 搞了半…

Python编辑开发---pycharm pro 2023 中文

PyCharm Pro 2023是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在提高Python开发人员的生产力。它提供了智能代码编辑、实时代码分析和调试工具&#xff0c;支持版本控制和数据库工具&#xff0c;以及可扩展的插件系统。PyCharm Pro 2023可在多…

《30天自制操作系统》学习笔记(七)

先体验一下编译仿真方法&#xff1a; 30天自制操作系统光盘代码在下面链接&#xff0c;但是没有编译仿真工具&#xff1a; https://gitee.com/zhanfei3000/30dayMakeOS 仿真工具在下面链接&#xff1a; https://gitee.com/909854136/nask-code-ide 这是一个集成的编译仿真工…

jrebel IDEA 热部署

1 下载 2022.4.1 JRebel and XRebel - IntelliJ IDEs Plugin | Marketplace 2 选择下载好的zip 离线安装IDEA 插件 重启IDEA 3 打开 [Preference -> JRebel & XRebel] 菜单&#xff0c;输入 GUID address 为 https://jrebel.qekang.com/1e67ec1b-122f-4708-87d…

WINCC读写EXCEL-VBS

原创 RENHQ WINCC 关于VBS操作EXCEL的文档不管在论坛上还是在网上&#xff0c;相关的脚本已经很多&#xff0c;但是依然有很多人在问这个问题&#xff0c;于是把我以前在论坛上发的一个集合帖子的脚本拿来&#xff0c;重新开个帖子&#xff0c;如果再有人问的话&#xff0c;可…

使用动态sql时,if标签不起作用

目录 场景&#xff1a; 问题分析&#xff1a; 问题解决&#xff1a; 场景&#xff1a; 简单讲一下应用场景 我拿到一个项目&#xff0c;完成后端数据处理&#xff0c;在进行可选条件查询时&#xff0c;使用动态sql 在mapper.xml中我先是这么写的 <select id"list&…

数学建模--比赛

内容来自数学建模BOOM&#xff1a;【快速入门】北海&#xff1a;数模建模基础MATLAB入门论文写作数学模型与算法(推荐数模美赛国赛小白零基础必看教程)_哔哩哔哩_bilibili 目录 1.学习内容 2.参赛须知 1&#xff09;参赛作品的组成 2)参赛作品的提交 3.软件安装 4.注意…

web蓝桥杯真题--10、灯的颜色变化

介绍 我们经常会看到各种颜色的灯光&#xff0c;本题我们将实现一个颜色会变化的灯的效果。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── effect.gif ├── images │ ├── greenlight.svg │ ├── l…

新手入门Java第二阶段 封装概念及包、访问修饰符和static修饰符介绍

第三章 封装 课前回顾 1.带参方法如何定义 访问修饰符 返回值类型 方法名(参数列表){//形式参数列表}对象名.方法名(实参列表);2.方法的参数是如何传递的 在java中&#xff0c;方法参数的传递都是值传递。只是基本数据类型作为参数传递时&#xff0c;传递的是值的拷贝。引用…

移动web开发流式布局

1.0 移动端基础 1.1 浏览器现状 PC端常见浏览器&#xff1a;360浏览器、谷歌浏览器、火狐浏览器、QQ浏览器、百度浏览器、搜狗浏览器、IE浏览器。 内核&#xff1a; 浏览器内核备注Safariwebkitwebkit内核是苹果公司开发的一款渲染引擎&#xff0c;目前已被很多手机厂商所采…