FFmpeg开发笔记(一百零一)跨平台的开源音视频移动框架MobileFFmpeg

除了剪映那样的视频剪辑软件,在移动系统上还有一款跨平台的开源音视频框架MobileFFmpeg,通过该框架可以很方便地执行音视频加工操作,下面就来介绍如何在App工程中使用MobileFFmpeg。

MobileFFmpeg 是一款专为 Android、iOS 和 tvOS 移动平台开发的开源音视频处理框架。它的核心作用是将强大的 FFmpeg 工具链移植到移动端,并提供简洁的上层 API,让开发者无需复杂的底层编译和 JNI 操作,就能在 App 里实现专业级的音视频编辑、转码与处理。

MobileFFmpeg几乎能实现电脑端 FFmpeg 的所有功能,包括:

1、格式转换:MP4、AVI、MKV、MOV、GIF 等互转。

2、视频编辑:裁剪、拼接、旋转、加水印、加字幕、倍速播放。

3、音频处理:提取音频、混音、降噪、格式转换(MP3、AAC、WAV)。

4、编码解码:支持 H.264 (x264)、H.265 (x265)、VP9 等主流编解码器。

5、滤镜特效:亮度、对比度、模糊、锐化、防抖等。

6、媒体信息:获取视频分辨率、码率、时长、编码格式等。

MobileFFmpeg的源码托管地址为https://github.com/tanersener/mobile-ffmpeg(星星数4.1k),最新版本是2021年2月发布的v4.4(源码仓库在2025年1月被打包,目前为只读状态),该版本的源码下载地址为https://github.com/tanersener/mobile-ffmpeg/archive/refs/tags/v4.4.LTS.tar.gz。

由于v4.4版本的MobileFFmpeg发布时间较早,为了让小海豚版本的Android Studio Dolphin能够打开它的范例工程,需要对MobileFFmpeg的android工程作如下修改:

一、升级Gradle版本

打开android目录下的gradle/wrapper/gradle-wrapper.properties,把下面这行配置

复制代码
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

改成如下这行配置,表示把Gradle版本从6.1.1升级到6.7.1。

复制代码
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip

二、更新工具库的仓库位置

打开android目录下的build.gradle,把里面的两处"jcenter()"都改为以下配置:

复制代码
// 以下四行添加阿里云的仓库地址,方便国内开发者下载相关插件
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { url 'https://maven.aliyun.com/repository/public'}
// 以下添加清华大学的仓库地址
maven { url = uri("https://mirrors.tuna.tsinghua.edu.cn/repository/maven-central/") }
google()
mavenCentral()

因为jcenter仓库已经废弃,所以改成引用国内的仓库位置。

三、调整模块级别的build.gradle

打开android/app目录下的build.gradle,把下面这行配置

复制代码
    ndkVersion "21.3.6528147"

改成下面这行,也就是注释掉ndk配置:

复制代码
    //ndkVersion "21.3.6528147"

接着把下面两行配置

复制代码
    testImplementation "androidx.test.ext:junit:1.1.1"
    testImplementation "org.json:json:20190722"

改成下面两行,也就是注释掉测试配置:

复制代码
    //testImplementation "androidx.test.ext:junit:1.1.1"
    //testImplementation "org.json:json:20190722"

四、修改临时目录的保存路径

打开android/test-app/src/main/java/com/arthenica/mobileffmpeg/test/VideoTabFragment.java,把encodeVideo方法内部的下面代码

复制代码
final File image1File = new File(requireContext().getCacheDir(), "colosseum.jpg");
final File image2File = new File(requireContext().getCacheDir(), "pyramid.jpg");
final File image3File = new File(requireContext().getCacheDir(), "tajmahal.jpg");

改为下面代码,也就是更换临时目录的保存路径:

复制代码
String privatePath = requireContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();
final File image1File = new File(privatePath, "colosseum.jpg");
final File image2File = new File(privatePath, "pyramid.jpg");
final File image3File = new File(privatePath, "tajmahal.jpg");

接着把getVideoFile方法内部的下面代码

复制代码
final String video = "video." + extension;
return new File(requireContext().getFilesDir(), video);

改为下面代码,同样是更换临时目录的保存路径:

复制代码
String privatePath = requireContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();
final String video = "video." + extension;
return new File(privatePath, video);

以上修改的目的是把临时目录改到应用自身的私有空间,避免访问公共空间出现未授权的异常。

修改以上配置和代码之后,等待MobileFFmpeg工程编译通过,把主入口的test-app模块安装到手机上,启动之后的App界面如下图所示:

MobileFFmpeg默认支持VP8和MPEG-4等视频编码器,先在界面上方切换到VIDEO标签,再点击界面中间的【ENCODE】按钮,app会把下方的演示图片自动转为一小段视频,转换过程如下图所示:

MobileFFmpeg也支持mp3、vorbis、opus等常见的音频编码器,比如先在界面上方切换到AUDIO标签,再点击界面中间的【ENCODE】按钮,界面下方会显示mp3音频的转换日志,如下图所示:

可见MobileFFmpeg支持视频转码、音频转码等常见的音视频加工操作,以及更多的命令行处理功能。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

相关推荐
TST-魚爷4 小时前
易视讯会议摄像头电视安装教程
android·电脑·钉钉·腾讯会议·zoom会议
墨天梦14 小时前
B17_LifecycleLiveData与Flow
android·kotlin
_祝你今天愉快15 小时前
UI核心 - 绘制流程(测量、布局、绘制)
android
揽秀亭长16 小时前
视频转脚本有哪些方法?5种方案技术拆解
人工智能·音视频
冬奇Lab16 小时前
LLM 驱动的自动化测试系列(07):移动端自动化(三)——Mobile-Agent-v3 与自研 GUI-Owl 模型路线
android·人工智能·测试
Android系统攻城狮17 小时前
Linux Gstreamer深度解析之gst_audio_sink_get_type调用流程与实战(六十五)
linux·运维·服务器·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
程序猿追18 小时前
HarmonyOS 6 音视频实战:用 AVPlayer 做一个本地音乐播放器
华为·音视频·harmonyos
leobertlan19 小时前
痛苦系列 | DSP-02 频域切片:DTFT与DFT的探索
android·后端
leobertlan20 小时前
痛苦系列 | DSP-01 从连续到离散:DSP基础与采样
android·后端
weixin_6906547421 小时前
龙迅#LT9611EX 现MIPI转HDMI1.4功能主推型号,分辨率高达4K30HZ,IC内置I2C无需外部12C控制。
嵌入式硬件·音视频·信号处理