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

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

下载代码

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" inarmv7a)CPU=armv7-aTARGET_TRIPLE=armv7a-linux-androideabi;;arm64)CPU=armv8-aTARGET_TRIPLE=aarch64-linux-android;;x86)CPU=i686TARGET_TRIPLE=i686-linux-android;;x86_64)CPU=x86_64TARGET_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/localadb 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     : mp42minor_version   : 0compatible_brands: isommp42creation_time   : 2025-03-03T07:01:49.000000Zcom.android.version: 14Duration: 00:02:31.20, start: 0.000000, bitrate: 21470 kb/sStream #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.000000Zhandler_name    : VideoHandlevendor_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.000000Zhandler_name    : SoundHandlevendor_id       : [0][0][0][0]
http://www.lryc.cn/news/547023.html

相关文章:

  • Verilog学习方法—基础入门篇(一)
  • 本地jar包添加到 maven
  • C# Unity 唐老狮 No.6 模拟面试题
  • 项目工坊 | Python驱动淘宝信息爬虫
  • Java8-Stream流介绍和使用案例
  • setlocale()的参数,“zh_CN.UTF-8“, “chs“, “chinese-simplified“的差异。
  • docker 安装达梦数据库(离线)
  • FastGPT 引申:如何基于 LLM 判断知识库的好坏
  • 关于2023新版PyCharm的使用
  • Leetcode 112: 路径总和
  • 华为云IAM 用户名和IAM ID
  • Compose Multiplatform+Kotlin Multiplatfrom 第四弹跨平台
  • 【Proteus仿真】【STM32单片机】全自动养护智能生态雨林缸
  • GBT32960 协议编解码器的设计与实现
  • SolidWorks 转 PDF3D 技术详解
  • OpenMCU(二):GD32E23xx FreeRTOS移植
  • Codeforces Round 835 (Div. 4)题解ABCDEFG
  • NO1.C++语言基础|四种智能指针|内存分配情况|指针传擦和引用传参|const和static|c和c++的区别
  • SQLite Having 子句详解
  • Python数据分析面试题及参考答案
  • Spring Boot 3 整合 MinIO 实现分布式文件存储
  • ubuntu20 安装python2
  • 2025.3.3总结
  • 多线程-JUC源码
  • ICLR 2025|香港浸会大学可信机器学习和推理课题组专场
  • docker引擎备份及解决拉取失败的问题
  • Django项目实战
  • 【ThreeJS Basics 1-6】Camera
  • SpringBoot-模拟SSE对话交互
  • 删除链表的倒数第N个节点 力扣19