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

news2024/11/18 21:51:41

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/bash

echo ">>>>>>>>> 编译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-v7a

function build_android
{
#如果你需要的是动态库,--enable-static 改为 --enable-shared

echo ">>>>>>>>开始编译<<<<<<<<<<"
  ./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 clean
  make
  make install

echo ">>>>>>编译完成!<<<<<<"
}

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-a

drwxr-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/bash

echo ">>>>>>>>> 编译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-shared

function 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_FEATURE


make clean
make
make install

echo "编译完成 $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-r21b

PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

PREFIX=$(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.coloradmin.cn/o/1395592.html

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

相关文章

触摸按键控制LED灯

目录 1.理论 2.代码 2.1 touch_ctrl_led.v 2.2 tb_touch_ctrl_led 1.理论 以上的波形图的touch_flag是采用组合逻辑的方式产生的。 以上的touch_flag是采用时序逻辑产生的&#xff0c;时序逻辑会延迟一拍。 以上是上升沿和下降沿的组合逻辑和时序逻辑实现&#xff0c;逻辑或…

Spring Boot - 利用Resilience4j-Circuitbreaker实现断路器模式_防止级联故障

文章目录 PreResilience4j概述Resilience4j官方地址Resilience4j-Circuitbreaker应用场景微服务演示Address servicePOMModelRepositoryServiceControllerData InitProperties测试 Order serviceModelRepositoryServiceSet UpProperties测试 探究断路器调用order-service API 2…

spring boot学习第八篇:kafka监听消费

为了实现监听器功能 pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

.NetCore Flurl.Http 4.0.0 以上管理客户端

参考原文地址&#xff1a;Managing Clients - Flurl 管理客户端 Flurl.Http 构建在堆栈之上System.Net.Http。如果您熟悉HttpClient&#xff0c;那么您可能听说过这个建议&#xff1a;不要为每个请求创建一个新客户端&#xff1b;重复使用它们&#xff0c;否则将面临后…

navigateTo失效-跳转不了页面解决办法!uniapp\vue

改了一个小时多的错误&#xff0c;跳转页面无论怎么样都跳转不了&#xff0c;有2个问题&#xff1a; 注意&#xff1a;uniapp的报错可以在console里检查&#xff01; 1.pages.json文件没有配置路径&#xff0c; 在pages:[ ]里面加 &#xff08;根据自己的路径进行修改 {&qu…

Plane Geometry (Junior High School)

初中平面几何&#xff0c; ACBD, ∠CAD60&#xff0c;∠C40&#xff0c;求∠B Vertical Calculation-CSDN博客 Rectangular Area-CSDN博客

详细介绍IP 地址、网络号和主机号、ABC三类、ip地址可分配问题、子网掩码、子网划分

1、 IP 地址: 网络之间互连的协议&#xff0c;是由4个字节(32位二进制)组成的逻辑上的地址。 将32位二进制进行分组&#xff0c;分成4组&#xff0c;每组8位(1个字节)。【ip地址通常使用十进制表示】ip地址分成四组之后&#xff0c;在逻辑上&#xff0c;分成网络号和主机号 2…

Java多线程并发篇----第二十二篇

系列文章目录 文章目录 系列文章目录前言一、DelayQueue(缓存失效、定时任务 )二、SynchronousQueue(不存储数据、可用于传递数据)三、LinkedTransferQueue四、LinkedBlockingDeque前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…

港科夜闻|香港科大团队研发多功能,可重构和抗破坏单线感测器阵列

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大团队研发多功能、可重构和抗破坏单线感测器阵列。研究人员开发出一种受人类听觉系统启发的感测器阵列设计技术。透过模仿人耳根据音位分布来区分声音的能力&#xff0c;这种新型感测器阵列方法可能优化感测器阵列…

Ansible-基础模块

目录 一 Ansible概述 1.Ansible是什么 2.为什么要学Ansible&#xff08;特点&#xff09; 二 Ansible的架构及运行机制 1.Ansible的架构 2.Ansible的运行机制 三 Ansible环境安装部署 1.控制节点安装ansible 2.Ansible目录结构 3.Ansible 命令行模块 &#xff08;1&a…

强化学习(二)多臂老虎机 “Multi-armed Bandits”——1

将强化学习与机器学习、深度学习区分开的最重要的特征为&#xff1a;它通过训练中信息来评估所采取的动作&#xff0c;而不是给出正确的动作进行指导&#xff0c;这极大地促进了寻找更优动作的需求。 1、多臂老虎机&#xff08;Multi-armed Bandits&#xff09;问题 赌场的老虎…

解析Transformer模型

原文地址&#xff1a;https://zhanghan.xyz/posts/17281/ 进入Transformer RNN很难处理冗长的文本序列&#xff0c;且很容易受到所谓梯度消失/爆炸的问题。RNN是按顺序处理单词的&#xff0c;所以很难并行化。 用一句话总结Transformer&#xff1a;当一个扩展性极佳的模型和一…

全链路压力测试:现代软件工程中的重要性

全链路压力测试不仅可以确保系统在高负载下的性能和稳定性&#xff0c;还能帮助企业进行有效的风险管理和性能优化。在快速发展的互联网时代&#xff0c;全链路压力测试已成为确保软件产品质量的关键步骤。 1、测试环境搭建 测试应在与生产环境尽可能相似的环境中进行&#xff…

RabbitMQ 部署与配置[CentOS7]

# RabbitMQ,Erlang 版本包对应 https://rabbitmq.com/which-erlang.html#eol-seriescd /usr/local/src# Erlang下载 # https://github.com/rabbitmq/erlang-rpm/releases https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.5/erlang-23.3.4.5-1.el7.x86_64.rp…

Spring 核心之 IOC 容器学习一

IOC 与 DI IOC(Inversion of Control)控制反转&#xff1a;所谓控制反转&#xff0c;就是把原先我们代码里面需要实现的对象创建、依赖的代码&#xff0c;反转给容器来帮忙实现。那么必然的我们需要创建一个容器&#xff0c;同时需要一种描述来让容器知道需要创建的对象与对象…

【探索C++容器:vector的使用和模拟实现】

【本节目标】 1.vector的介绍及使用 2.vector深度剖析及模拟实现 1.vector的介绍及使用 1.1 vector的介绍 vertor文档介绍 1. vector是表示可变大小数组的序列容器。2. 就像数组一样&#xff0c;vector也采用连续存储空间来存储元素。也就是意味着可以采用下标对vector的元…

时间触发以太网TTE交换机混合流量测试方法

在本世纪初&#xff0c;TTE最早是由维也纳科技大学Hermann Kopetz 赫尔曼科佩茨教授等人提出来的&#xff0c;在国际上比较知名的TTE开发机构主要是以奥地利的TTTech公司为主&#xff0c;尔曼科佩茨教授是该公司的创始人之一&#xff0c;这家公司是将教授的理论进行了产业化应用…

iOS原生应用屏幕适配完整流程

1. 已iPhone 11 布局为设计布局,其他机型已这个来适配 2.变量与控件对应关系 txtViewer: txtAccount txtpwd seg btnOk 3.适配方法实现: //iOS屏幕适配 -(vo

深度求索开源国内首个 MoE 大模型 | DeepSeekMoE:在专家混合语言模型中实现终极专家专业化

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 在大语言模型时代&#xff0c;混合专家模型&#xff08;MoE&#xff09;是一种很有前途的架构&#xff0c;用于在扩展模型参数时管理计算成本。然而&a…

【文本到上下文 #5】:RNN、LSTM 和 GRU

一、说明 欢迎来到“完整的 NLP 指南&#xff1a;文本到上下文 #5”&#xff0c;这是我们对自然语言处理 &#xff08;NLP&#xff09; 和深度学习的持续探索。从NLP的基础知识到机器学习应用程序&#xff0c;我们现在深入研究了神经网络的复杂世界及其处理语言的深刻能力。 在…