编译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.hqwc.cn/news/413449.html

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

相关文章

存内计算技术打破常规算力局限性

说明&#xff1a; 本文撰写人&#xff1a;三掌柜666 由三掌柜666原创首发&#xff1a;https://blog.csdn.net/CC1991_/article/details/135623056 文章目录 前言关于存内计算1、常规算力局限性2、存内计算诞生记3、存内计算核心 存内计算芯片研发历程及商业化1、存内计算芯片研…

Unix时间戳

时间戳&#xff0c;相信很多相关专业的人&#xff0c;计算机软件电子等等都会听过。由于最早是由Unix系统使用所以又叫Unix时间戳。 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC&#xff08;世界协调时&#xff09;/GMT&#xff08;格林尼治时&#xff09;…

【Java】SpringBoot快速整合Redis

什么是Redis&#xff1f; 文末有源码gitee地址 【面试】浅学Redis_redis 广播-CSDN博客 Redis是一种高性能开源的基于内存的&#xff0c;采用键值对存储的非关系型数据库&#xff0c;它支持多种数据结构&#xff0c;包括字符串、哈希表、列表、集合、有序集合等。Redis的特点之…

机器学习--Matplotlib

机器学习–Matplotlib Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进、交互式方式实现数据可视化 简单的Matplotlib画图 — 以折线图为例 matplotlib.pyplot模块 matplotlib.pytplot包含了一系列类似于matlab的画图函数。 import matplotlib.pyplot as plt图形绘制流…

STM32入门教程-2023版【4-1】OLED调试工具

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 一、概述 在这一节先提前介绍一下&#xff0c;在以后的教程中我们会经常用到这个显示屏&#xff0…

HCIA的访问控制列表ACL

ACL -----access control-list 允许/拒绝 ACL作用&#xff1a; 1.实现访问控制 2.定义感兴趣流量 ACL分类&#xff1a; 标准ACL 2000-2999&#xff08;只关注源IP地址&#xff0c;使用时应该尽量靠近目标&#xff09; 扩展ACL 3000-3999&#xff1a;写ACL不能写在源上&…

Java基础知识整理,注释、关键字、运算符

写在开头 万丈高楼平地起&#xff0c;要想学好汉语首先学拼音&#xff0c;想学好英语首先学26个字母&#xff0c;对于编程语言来说&#xff0c;一样的道理&#xff0c;要想学好必须先掌握其基础语法和知识&#xff0c;今天我们就来唠一唠Java语言中那些出现频率极高&#xff0…

Linux:shell脚本:基础使用(8)《函数局部|全局变量函数传入位置变量return》

基本的函数定义 把一些重复调用的命令写进一个函数里&#xff0c;下次直接调用函数名&#xff0c;这样的既方便修改&#xff0c;又可以让思路清晰 function 函数名(){ 当调用这个函数时候执行的命令...... } 这个是一个基础的函数定义&#xff0c;当然你不加function也是可以的…

Three.js Tri-panner (三面贴图) 材质 两种实现方式

文章目录 介绍自定义shaderNodeMaterial修复&#xff1a;骨骼材质特殊处理修复&#xff1a;使用法相贴图时整体变色 介绍 Tri-panner 在babylonjs中有支持 但是three.js目前的基础材质并不支持 需要自己定义shader 或者使用目前还没有什么完善的文档的 NodeMaterial 下面展示两…

C++ 之LeetCode刷题记录(十三)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可…

为什么使用双token实现无感刷新用户认证?

单token机制 认证机制&#xff1a;对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处&#xff1a; 安全性较低(因为只有一个token在客户端和服务器端之间进行传递&#xff0c;一目Acess Token被截获或者被泄露…

卷级实时备份功能特点及应用场景

为满足部分对RTO和RPO指标敏感的用户需求&#xff0c;云祺科技通过结合卷远程复制技术和持续数据保护技术、以及高可用技术的原理&#xff0c;推出了一款基于卷为最小处理单元的实时容灾备份产品&#xff0c;其对于备份源对象具有良好的兼容性&#xff0c;无论是文件、影音、应…