FFmpeg中使用Android Content协议打开文件设备
引言
随着Android 10引入的Scoped Storage(分区存储)机制,传统的文件访问方式发生了重大变化。FFmpeg作为强大的多媒体处理工具,也在不断适应Android平台的演进。本文将介绍如何在FFmpeg 7.0+版本中使用Android content协议直接访问文件,为开发者提供更便捷的多媒体处理方案。
需要说明的是,本文记录的是我个人的实践经验,并非官方文档。由于相关技术较新,网络上的参考资料有限,如有错误疏漏,还请大家指点。
背景:Scoped Storage与文件访问挑战
自Android 10(API 29)起,Google实施了Scoped Storage策略,即使应用拥有READ_EXTERNAL_STORAGE
权限,也无法直接通过/sdcard/
路径访问文件。开发者必须使用Storage Access Framework (SAF)获取用户选择文件的content URI。这给多媒体处理带来了新的挑战。
传统方案:文件描述符(fd)协议
在FFmpeg支持content协议之前,开发者通常采用以下工作流程:
- 通过SAF获取文件URI
- 转换为文件描述符(fd)
- 通过FFmpeg的fd协议处理文件
// Java端实现
private int getFileDescriptor(Uri uri) {try (ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "r")) {return pfd != null ? pfd.detachFd() : -1;} catch (IOException e) {Log.e(TAG, "Error opening file descriptor", e);return -1;}
}
这种方案存在以下局限性:
- 需要额外的Java层转换代码
- 文件描述符管理复杂
- 不支持直接URI访问
- 跨进程传递文件描述符存在兼容性问题
现代化方案:Content协议支持
2024年2月,FFmpeg正式合并了对Android content协议的支持(提交记录:6567516a5ef),开发者现在可以直接使用content URI进行多媒体处理。
环境配置
1. 初始化JNI环境
在JNI加载时设置Java虚拟机:
#include <jni.h>extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {av_jni_set_java_vm(vm, nullptr);return JNI_VERSION_1_6; // 建议使用较新的JNI版本
}
2. 传递应用上下文
// MainActivity.java
public native void initFFmpeg(Context context);// 在Activity初始化时调用
initFFmpeg(getApplicationContext());
对应的JNI实现:
extern "C" JNIEXPORT void JNICALL
Java_com_example_media_MainActivity_initFFmpeg(JNIEnv* env,jobject thiz,jobject context) {// 创建全局引用防止被GC回收jobject global_ctx = env->NewGlobalRef(context);av_jni_set_android_app_ctx(global_ctx, nullptr);
}
使用Content协议
配置完成后,可以直接将SAF获取的URI传递给FFmpeg:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_PICK_VIDEO && resultCode == RESULT_OK&& data != null) {Uri uri = data.getData();String ffmpegUrl = uri.toString();// 传递给FFmpeg处理processMediaWithFFmpeg(ffmpegUrl);}
}
结论
FFmpeg对Android content协议的支持显著简化了在Scoped Storage环境下的多媒体处理流程。开发者现在可以:
- 直接使用SAF获取的URI
- 减少Java层转换代码
- 获得更好的内存管理
- 保持与Android最新存储策略的兼容性
建议新项目优先采用content协议方案,既符合Android最佳实践,又能简化开发流程。对于需要支持旧版FFmpeg的项目,可暂时保留fd协议作为fallback方案。
参考资料
- FFmpeg官方提交记录
- Android Scoped Storage文档
- Storage Access Framework指南
相关文章:
FFmpeg中使用Android Content协议打开文件设备
引言 随着Android 10引入的Scoped Storage(分区存储)机制,传统的文件访问方式发生了重大变化。FFmpeg作为强大的多媒体处理工具,也在不断适应Android平台的演进。本文将介绍如何在FFmpeg 7.0版本中使用Android content协议直接访…...
SQL语句的执行流程
文章目录 一、执行流程二、建立连接三、预处理器四、解析器4.1 词法分析4.2 语法分析4.3 语义分析 五、优化器六、执行器七、返回结果 一、执行流程 阶段主要功能关键组件1. 建立连接身份验证、权限检查连接器2. 预处理器缓存检查、SQL预处理查询缓存3. 解析器词法分析、语法分…...
Spring 框架的JDBC 模板技术
一、JDBC 模板技术概述 1、什么模板技术? Spring 框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单。 2、template 模板 都是 Spring 框架来提供XxxTemplate,比如Spring框架提供了 JDBC 模板。 JdbcTemplate 类&…...

【游戏设计】游戏玩法与游戏机制
在游戏设计中,“玩法”(Gameplay)和“机制”(Game Mechanic)是两个频繁出现但容易混淆的概念。许多新手开发者、设计师甚至玩家常常将两者混为一谈。本文将通过定义、对比和案例解析的方式,清晰地阐明二者的…...

Spring的资源Resource和ResourceLoader
两者区别和联系 Resource 和ResourceLoader 都是 Spring 框架中用于资源访问的接口 Resource 是“资源本身”,ResourceLoader 是“资源工厂/加载器”,负责创建 Resource。 Resource:Spring 统一抽象的“资源”对象,可以表示文件、类路径下的文件、U…...
字节跳动旗下火山引擎都覆盖哪些领域
首先,我需要确认火山引擎的主要业务范围。根据之前的资料,火山引擎是字节跳动的企业技术服务平台,可能包括云服务、人工智能、大数据分析等。不过需要更详细的信息,比如具体的产品和服务,覆盖的行业等。 接下来&#x…...

【AI实战】从“苦AI”到“爽AI”:Magentic-UI 把“人类-多智能体协作”玩明白了!
Hello,亲爱的小伙伴们!你是否曾经在深夜里,为了自动化点外卖、筛机票、抓网页数据焦头烂额?有没有幻想过哪天能出个“贴心AI管家”,一键点菜、搞定事务、自动操作网页,比你还懂你?更关键——还让…...
LeetCode面试经典150题梳理
link:https://leetcode.cn/studyplan/top-interview-150/ 日期题号备注2025.5.2288. 合并两个有序数组 - 力扣(LeetCode)通过双指针法从后向前合并来解决,避免覆盖nums1中的元素2025.5.2327. 移除元素 - 力扣(LeetCode…...
ABP VNext + Orleans:Actor 模型下的分布式状态管理最佳实践
ABP VNext Orleans:Actor 模型下的分布式状态管理最佳实践 🚀 📚 目录 ABP VNext Orleans:Actor 模型下的分布式状态管理最佳实践 🚀一、引言:分布式系统的状态挑战 💡二、架构图与技术栈 &am…...

Linux之 SPI 驱动框架- spi-mem 框架
一、框架变更的历程 1.1 旧框架图 1.2 新框架图 那么问题来了, 为什么要开发新的 SPI 存储器接口? 有了这个新的框架, SPI NOR 和SPI NAND 都可以基于相同的SPI控制器驱动进行支持了。m25p80 驱动将被修改成,使用spi-mem 接口&a…...

振动分析 - 献个宝
1.一个自制的振动能量分析工具 这个分析工具似乎真的定位到了故障的具体位置。 1.1对一组实验室虚拟信号的分析结果: 1.2 对现场真实数据的分析结果 依照边频带的调制,和边频的缝隙宽度,基本定位到问题。 追加几份待看的文档: 齿轮结构的频谱特征 - 知乎使用 FFT 获得…...
从脑电图和大脑记录中学习稳健的深度视觉表征
从脑电图和大脑记录中学习稳健的深度视觉表征 印度,印度,印度,印度大脑实验室,印度 例如,达拉普,克普拉萨德,山,山,新的。ac .在 摘要 解码人类大脑一直是新机器人科学家…...

【论文阅读】——D^3-Human: Dynamic Disentangled Digital Human from Monocular Vi
文章目录 摘要1 引言2 相关工作3 方法3.1 HmSDF 表示3.2 区域聚合3.3. 变形场3.4. 遮挡感知可微分渲染3.5 训练3.5.1 训练策略3.5.2 重建损失3.5.3 正则化限制 4. 实验4.1 定量评估4.2 定性评价4.3 消融研究4.4 应用程序 5 结论 摘要 我们介绍 D 3 D^{3} D3人,一种…...

高分辨率北半球多年冻土数据集(2000-2016)
关键数据集分类:冰冻圈数据集时间分辨率:10 year < x < 100 year空间分辨率:1km - 10km共享方式:开放获取数据大小:339.79 MB数据时间范围:2000-01-01 — 2016-12-31元数据更新时间:2022-…...
Prompt Tuning:轻量级大模型微调全攻略
Prompt Tuning(提示调优)步骤金额流程 传统的 Prompt Tuning(提示调优) 是一种轻量级的大模型微调技术,核心是通过优化连续的提示向量(而非模型参数)来适配特定任务。 一、核心步骤概述 准备任务与数据 明确任务类型(如分类、问答等),准备输入文本和目标标签。加载…...
【VBA 字典的引用和调用方法】
如何引用字典对象。在VBA中,字典不是内置的,所以需要引用Microsoft Scripting Runtime库。 在 VBA 中使用 Dictionary(字典)对象可以方便地存储键值对(Key-Item)数据,以下是引用方法和常用参数介…...

基于开源AI智能名片链动2+1模式S2B2C商城小程序的管理与运营策略研究
摘要:本文通过分析开源AI智能名片链动21模式S2B2C商城小程序的技术架构与商业逻辑,探讨其在企业管理与运营中的实践价值。结合案例研究,论证该模式如何通过清晰的目标设定、动态反馈机制和资源整合能力,提升团队执行力与客户粘性。…...

储能电站:风光储一体化能源中心数字孪生
在 “双碳” 目标引领下,我国能源产业加速向清洁低碳、绿色化转型,风能、太阳能等可再生能源的开发利用成为关键。然而,风能和太阳能的波动性、间歇性与随机性,给大规模接入电网带来挑战。储能技术的兴起,为解决这一难…...
iOS 直播特殊礼物特效实现方案(Swift实现,超详细!)
特殊礼物特效是提升直播互动体验的关键功能,下面我将详细介绍如何在iOS应用中实现各种高级礼物特效。 基础特效类型 1.1 全屏动画特效 class FullScreenAnimationView: UIView {static func show(with gift: GiftModel, in view: UIView) {let effectView FullS…...

9. 现代循环神经网络
文章目录 9.1. 门控循环单元(GRU)9.1.1. 门控隐状态9.1.1.1. 重置门和更新门9.1.1.2. 候选隐状态9.1.1.3. 隐状态 9.1.2. 从零开始实现9.1.2.1. 初始化模型参数9.1.2.2. 定义模型 9.1.3. 简洁实现9.1.4. 小结 9.2. 长短期记忆网络(LSTM&#…...

视频太大?用魔影工厂压缩并转MP4,画质不打折!
在日常生活中,我们常常需要将视频文件转换成不同的格式以适应各种设备或平台的播放需求。魔影工厂作为一款功能强大且操作简单的视频转换工具,深受用户喜爱。本文中简鹿办公将手把手教你如何使用魔影工厂将视频转换为MP4格式,并进行个性化设置…...
Python中tqdm进度条工具和enumerate函数的使用详解
tqdm进度条工具 tqdm 是 Python 中一个非常流行的 进度条显示工具库,常用于迭代操作的可视化,比如训练神经网络、批量数据处理等任务。 一、tqdm 是什么? tqdm 全称是 taqaddum(阿拉伯语,意为“进展”)&a…...

最宽温度范围文本格式PT1000分度表-200~850度及PT1000铂电阻温度传感器计算公式
常用PT铂电阻温度传感器 该图片来自网络,在此对图片作者表示感谢。 白色陶瓷面为测温面。 近距离图片。 常用的有PT100、PT500、PT1000,不常用的还有 PT50、PT200、PT10000等,PT代表铂电阻,后面的数字是零摄氏度时电阻值&#…...
基于Netty架构的充电桩系统设计:服务器运维如何更好保障稳定性?
Netty是一个异步事件驱动的网络应用框架,用于快速开发高性能、高可靠性的网络服务器和客户端。它本质上是NIO的封装和增强,主要针对TCP/IP协议下高性能网络通信场景。 本设计通过Netty的高性能网络通信能力,结合充电桩行业特性,实…...
操作系统学习笔记第1章 操作系统概述(灰灰题库
1.单选题 用户发起系统服务请求时,处理器处于______。 A. 用户态 B. 核心态 C. 阻塞态 D. 挂起态 第 1 题 答案:A 解析:用户态下,用户程序只能执行非特权指令 。当用户发起系统服务请求(通常通过系统调用)时…...
后端开发实习生-抖音生活服务
职位描述 ByteIntern:面向2026届毕业生(2025年9月-2026年8月期间毕业),为符合岗位要求的同学提供转正机会。 团队介绍:生活服务业务依托于抖音、抖音极速版等平台,致力于促进用户与本地服务的连接。过去一…...

机器学习算法-sklearn源起
scikit-learn(简称 sklearn)是 Python 中最流行的开源机器学习库之一,基于 NumPy、SciPy 和 Matplotlib 构建。它提供了丰富的机器学习算法和工具,适用于数据挖掘和数据分析任务。以下是其核心特点的简介: 1、sklearn主…...
Keepalived 在不同场景下的高可用方案设计与最佳实践
一、Keepalived 典型应用场景深度解析 1. Web 服务器集群:统一入口与故障容错 1.1 场景需求 核心目标:为多台 Web 服务器提供统一 VIP 入口,隐藏后端节点细节,实现故障透明切换。 挑战: 确保用户请求在主节点故障时…...

注册并创建一个微信小程序
目录 (一)前往微信公众平台,并注册一个微信小程序账号 (二)配置微信小程序 (三)创建微信小程序项目 1.流程 1.1获取小程序ID 1.2下载微信开发者工具 1.3安装微信开发者工具 2.创建项目…...
CentOS 10:启动telnet服务
参考, 鳥哥私房菜 - 第七章、網路安全與主機基本防護:限制埠口, 網路升級與 SELinux 7.3.3 埠口与服务的启动/关闭及开机时状态设定 我们知道系统的 Telnet 服务通常是以 super daemon 来控管的,请您启动您系统的 telnet 试看看。 1 要启动 …...