编译可以在Android手机上运行的ffmpeg程序

news2025/3/5 11:01:42

下载代码

git clone git@github.com:FFmpeg/FFmpeg.git
git checkout n7.0

建立build目录

mkdir build
cd build

创建build.sh脚本

vim build.sh

这段脚本的主要功能是配置和编译 FFmpeg,使其能够在 Android 平台上运行,通过设置不同的架构和 API 级别,可以生成适用于不同 Android 设备的 FFmpeg 库。

#!/bin/bash

# 设置 NDK 路径(需替换为实际路径)

NDK=/home/hui/Android/Sdk/ndk/21.0.6113669/

# 选择目标架构(armv7a/arm64/x86/x86_64)

ARCH=arm64
API=21

# 工具链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

# 输出目录
PREFIX=$(pwd)/android/$ARCH

# 根据架构配置参数
case "$ARCH" in
  armv7a)
    CPU=armv7-a
    TARGET_TRIPLE=armv7a-linux-androideabi
    ;;
  arm64)
    CPU=armv8-a
    TARGET_TRIPLE=aarch64-linux-android
    ;;
  x86)
    CPU=i686
    TARGET_TRIPLE=i686-linux-android
    ;;
  x86_64)
    CPU=x86_64
    TARGET_TRIPLE=x86_64-linux-android
    ;;
esac

# 编译器路径
CC=$TOOLCHAIN/bin/$TARGET_TRIPLE$API-clang
CXX=$TOOLCHAIN/bin/$TARGET_TRIPLE$API-clang++
STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip

# FFmpeg 配置参数
../configure \
  --prefix=$PREFIX \
  --disable-shared \
  --enable-static \
  --enable-gpl \
  --enable-cross-compile \
  --enable-jni \
  --enable-ffmpeg \
  --disable-doc \
  --target-os=android \
  --arch=$ARCH \
  --cpu=$CPU \
  --cc=$CC \
  --cxx=$CXX \
  --strip=$STRIP \
  --sysroot=$TOOLCHAIN/sysroot \
  --extra-cflags="-march=$CPU -O3 -fPIC" \
  --extra-ldflags="-Wl,-rpath-link=$TOOLCHAIN/sysroot/usr/lib"

make clean
make -j16
make install

关键步骤说明

设置路径:包括 NDK 路径、工具链路径和输出目录。

配置参数:根据目标架构设置相应的编译参数。

调用 FFmpeg 配置脚本:传递所有必要的参数以配置 FFmpeg 编译环境。

编译和安装:清理之前的编译结果,进行编译并安装生成的库文件。

FFmpeg 配置脚本

../configure \
  --prefix=$PREFIX \
  --disable-shared \
  --enable-static \
  --enable-gpl \
  --enable-cross-compile \
  --enable-jni \
  --enable-ffmpeg \
  --disable-doc \
  --target-os=android \
  --arch=$ARCH \
  --cpu=$CPU \
  --cc=$CC \
  --cxx=$CXX \
  --strip=$STRIP \
  --sysroot=$TOOLCHAIN/sysroot \
  --extra-cflags="-march=$CPU -O3 -fPIC" \
  --extra-ldflags="-Wl,-rpath-link=$TOOLCHAIN/sysroot/usr/lib"

参数解释:

--prefix=$PREFIX:指定安装目录。

--disable-shared:禁用共享库生成。

--enable-static:启用静态库生成。

--enable-gpl:启用 GPL 许可证的功能。

--enable-cross-compile:启用交叉编译。

--enable-jni:启用 JNI 支持。

--enable-ffmpeg:启用 FFmpeg 应用程序。

--disable-doc:禁用文档生成。

--target-os=android:指定目标操作系统为 Android。

--arch=$ARCH:指定目标架构。

--cpu=$CPU:指定目标 CPU 架构。

--cc=$CC--cxx=$CXX:指定 C 和 C++ 编译器路径。

--strip=$STRIP:指定用于剥离调试符号的工具路径。

--sysroot=$TOOLCHAIN/sysroot:指定系统根目录。

--extra-cflags="-march=$CPU -O3 -fPIC":指定额外的编译标志。

--extra-ldflags="-Wl,-rpath-link=$TOOLCHAIN/sysroot/usr/lib":指定额外的链接标志。

--disable-shared & --enable-static好处是把ffmpeg编译成一个独立的可执行文件,放到手机里面的时候只需要把ffmpeg程序push进去即可。

在手机上运行

adb push ffmpeg /data/local

adb shell
$ chmod +x /data/local/ffmpeg
$ /data/local/ffmpeg -i /sdcard/

执行ffmpeg命令:

phone:/sdcard $ /data/local/ffmpeg -i input.mp4 

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2025-03-03T07:01:49.000000Z
    com.android.version: 14
  Duration: 00:02:31.20, start: 0.000000, bitrate: 21470 kb/s
  Stream #0:0[0x1](eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 2160x3840, 21371 kb/s, 60 fps, 60 tbr, 90k tbn (default)
      Metadata:
        creation_time   : 2025-03-03T07:01:49.000000Z
        handler_name    : VideoHandle
        vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 96 kb/s (default)
      Metadata:
        creation_time   : 2025-03-03T07:01:49.000000Z
        handler_name    : SoundHandle
        vendor_id       : [0][0][0][0]

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

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

相关文章

华为hcia——Datacom实验指南——配置手工模式以太网链路聚合

什么是以太网链路聚合(Eth-trunk) 是一种将多个物理链路捆绑在一起,让设备以为是一条大链路,能够增加带宽,增加冗余度,提升可靠性,实现负载平衡。 传输方式有两种 基于数据流传输和基于数据包…

【C语言6】数组和函数实践:扫雷游戏的简单实现

文章目录 一、扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析1.2.2 文件结构设计 二、扫雷游戏的代码实现三、扫雷游戏的扩展总结 一、扫雷游戏分析和设计 1.1 扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续…

LeetCode 热题 100----1.两数之和

LeetCode 热题 100----1.两数之和 题目描述 我的解法 语言:js 思路就是:用双重循环去找哪两个数字相加等于target,目前的时间复杂度为O(n2),之后右优化思路再更新。

《模式和状态管理》知识总结三-EcuM与BswM模块的交互

前言 这篇文章主要搞清楚在模式管理中,BswM和EcuM各自的分工。距离学完模式管理也有几天时间了,写这篇文章算是复习一下。 EcuM及BswM交互总览 EcuM负责Ecu的上下电状态的处理,当Ecu处于正常运行状态的时候,EcuM会将Ecu的控制权…

客户需求模糊或频繁变更怎么办

应对客户需求模糊或频繁变更的关键在于 明确沟通、敏捷应对、科学决策。其中,明确沟通尤为重要,因为通过有效沟通,不仅能迅速厘清客户真实需求,还能及时发现隐藏问题,降低项目风险,为后续调整提供有力数据支…

动静态库-Linux 学习

在软件开发中,程序库是一组预先编写好的程序代码,它们存储了常用的函数、变量和数据结构等。这些库可以帮助开发者节省大量的时间和精力,避免重复编写相同的代码。当我们在 Linux 系统中开发程序时,经常会用到两种类型的程序库&am…

DeepSeek 系列模型:论文精读《A Survey of DeepSeek Models》

引言:一篇快速了解 DeepSeek 系列的论文。我在翻译时加入了一些可以提高 “可读性” 的连词 ✅ NLP 研 2 选手的学习笔记 笔者简介:Wang Linyong,NPU,2023级,计算机技术 研究方向:文本生成、大语言模型 论文…

机器人学习模拟框架 robosuite (3) 机器人控制代码示例

Robosuite框架是一个用于机器人模拟和控制的强大工具,支持多种类型的机器人。 官方文档:Overview — robosuite 1.5 documentation 开源地址:https://github.com/ARISE-Initiative/robosuite 目录 1、通过键盘或SpaceMouse远程控制机器人…

kakfa-3:ISR机制、HWLEO、生产者、消费者、核心参数负载均衡

1. kafka内核原理 1.1 ISR机制 光是依靠多副本机制能保证Kafka的高可用性,但是能保证数据不丢失吗?不行,因为如果leader宕机,但是leader的数据还没同步到follower上去,此时即使选举了follower作为新的leader&#xff…

【微知】如何查看Mellanox网卡上的光模块的信息?(ethtool -m enp1s0f0 看型号、厂商、生产日期等)

背景 服务器上插入的光模块经常被忽略,往往这里是定位问题最根本的地方。如何通过命令查看? 命令 ethtool提供了-m参数,m是module-info的意思,他是从光模块的eeprom中读取数据。(应该是用i2c协议读取的)…

yum源选要配置华为云的源,阿里云用不了的情况

curl -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo

好数——前缀和思想(题目分享)

今天我的舍友去参加“传智杯”广东省的省赛,跟我说了这样一道题,他说他想不出来怎么去优化代码,怎么做都是套用两层for循环超时,下面我就根据题意,使用前缀和的算法去优化一下思路,题目本身是不难的&#x…

MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革

随着人工智能、大模型等技术的蓬勃发展,生成式AI应用全面爆发。在此背景下,服务机器人作为大模型技术在端侧落地的关键场景,迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备,服务机器人需要应对复杂场景下的感知、决策和…

springboot425-基于SpringBoot的BUG管理系统(源码+数据库+纯前后端分离+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…

FineReport 操作注意

1.父单元格重复的时候,如何取消合并 效果如下: 只需要在单元格中,将数据设置为【列表】即可。 2.待定

3D手眼标定转换详细实施步骤及原理概述

3D手眼标定转换详细实施步骤及原理概述 一、手眼标定的核心目标二、3D手眼标定的原理概述一、基本概念与坐标系定义**二、数学建模与方程推导****1. 坐标变换的齐次矩阵表示****2. 手眼标定方程推导** **三、方程求解方法****1. 分离旋转与平移****2. 旋转矩阵求解****3. 平移向…

Verilog:SCCB控制器

目录 一、SCCB协议 (1)SCCB时序 (2)与I2C的区别 二、Verilog 实现 (1)设计要求 (2)设计要点 (3)模块完整代码 三、功能验证 (1)写…

与中国联通技术共建:通过obdiag分析OceanBase DDL中的报错场景

中国联通软件研究院(简称联通软研院)在全面评估与广泛调研后,在 2021年底决定采用OceanBase 作为基础,自研分布式数据库产品CUDB(即China Unicom Database,中国联通数据库)。目前,该…

大数据与网络安全讲座

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 大数据的价值为大家公认。业界通常以4个“V”来概括大数据的基本特征——Volume(数据体量巨大)、Variety(数据类型繁多)、Value(价值密度低)、Velocity(处理速度快…

张驰咨询:用六西格玛重构动力电池行业的BOM成本逻辑

在动力电池行业,BOM(物料清单)成本每降低1%,都可能改写企业的利润曲线。某头部企业的三元锂电池BOM成本曾较行业标杆高出11%,单电芯利润率被压缩至3%的生死线。然而,通过张驰咨询的六西格玛方法论&#xff…