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協議之前,開發者通常采用以下工作流程:

  1. 通過SAF獲取文件URI
  2. 轉換為文件描述符(fd)
  3. 通過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方案。

參考資料

  1. FFmpeg官方提交記錄
  2. Android Scoped Storage文檔
  3. Storage Access Framework指南

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84389.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue——v-pre的使用

&#x1f530; 基礎理解 ? 什么是 v-pre&#xff1f; v-pre 是一個跳過編譯的 Vue 指令。 它告訴 Vue&#xff1a;“這個元素和其子元素中的內容不要被編譯處理&#xff0c;按原樣輸出。” ? 使用場景&#xff1a; 展示原始的 Mustache 插值語法&#xff08;{{ xxx }}&a…

PyTorch中TensorBoardX模塊與torch.utils.tensorboard模塊的對比分析

文章目錄 說明1. 模塊起源與開發背景2. 功能特性對比3. 安裝與依賴關系4. 性能與使用體驗5. 遷移與兼容性策略6. 最佳實踐與建議7. 未來展望8. 結論實際相關信息推薦資源 說明 TensorBoard&#xff1a;獨立工具&#xff0c;只需安裝tensorboard。TensorFlow&#xff1a;非必需…

單片機中斷系統工作原理及定時器中斷應用

文件目錄 main.c #include <REGX52.H> #include "TIMER0.H" #include "KEY.H" #include "DELAY.H"//void Timer0_Init() { // TMOD 0x01; // TL0 64536 % 256; // TH0 64536 / 256; // ET0 1; // EA 1; // TR0 1; //}unsigned char…

Python爬蟲實戰:研究Portia框架相關技術

1. 引言 1.1 研究背景與意義 在大數據時代,網絡數據已成為企業決策、學術研究和社會分析的重要資源。據 Statista 統計,2025 年全球數據總量將達到 175ZB,其中 80% 以上來自非結構化網絡內容。如何高效獲取并結構化這些數據,成為數據科學領域的關鍵挑戰。 傳統爬蟲開發需…

【機器學習基礎】機器學習與深度學習概述 算法入門指南

機器學習與深度學習概述 算法入門指南 一、引言&#xff1a;機器學習與深度學習&#xff08;一&#xff09;定義與區別&#xff08;二&#xff09;發展歷程&#xff08;三&#xff09;應用場景 二、機器學習基礎&#xff08;一&#xff09;監督學習&#xff08;二&#xff09;無…

[C語言初階]掃雷小游戲

目錄 一、原理及問題分析二、代碼實現2.1 分文件結構設計2.2 棋盤初始化與打印2.3 布置雷與排查雷2.4 游戲主流程實現 三、后期優化方向 在上一篇文章中&#xff0c;我們實現了我們的第二個游戲——三子棋小游戲。這次我們繼續結合我們之前所學的所有內容&#xff0c;制作出我們…

ROS云課三分鐘-破壁篇GCompris-一小部分支持Edu應用列表-2025

開啟藍橋云課ROS ROS 機器人操作系統初級教程_ROS - 藍橋云課 安裝和使用GCompris 終端輸入&#xff1a;sudo apt install gcompris sudo apt install gcompris ok&#xff0c;完成即可。 sudo apt install gcompris 如果是平板&#xff0c;秒變兒童學習機。 啟動 流暢運…

Linux系統基礎——是什么、適用在哪里、如何選

一、Linux是什么 Linux最初是由林納斯托瓦茲&#xff08;Linus Torvalds&#xff09;基于個人興趣愛好開發的個人項目&#xff0c;他編寫了最核心的內核&#xff1b;后面為了發展壯大Linux系統他將整個項目開源到GitHub上&#xff0c;可以讓全世界的人都參與到項目的開發維護中…

26、AI 預測性維護 (燃氣輪機軸承) - /安全與維護組件/ai-predictive-maintenance-turbine

76個工業組件庫示例匯總 AI 預測性維護模擬組件 (燃氣輪機軸承) 概述 這是一個交互式的 Web 組件,旨在模擬基于 AI 的預測性維護 (Predictive Maintenance, PdM) 概念,應用于工業燃氣輪機的關鍵部件(例如軸承)。它通過模擬傳感器數據、動態預測剩余使用壽命 (RUL),并根…

el-form 使用el-row el-col對齊 注意事項

1.el-form 使用inline&#xff0c;el-form-item寬度會失效。 2.為了保證el-form-item 和 它內部的el-input 能在一行&#xff0c;要設置el-form-item的label-width <el-form :model"editInspectform"><el-row style"margin-bottom: 20px"><…

mac 安裝 mysql 和 mysqlshell

1. 安裝 mysql https://dev.mysql.com/downloads/mysql/?spma2c6h.12873639.article-detail.4.37474f4dTHdszC 默認mysql未配置環境變量&#xff0c;可以在設置中找到 2. 安裝 mysqlshell https://dev.mysql.com/downloads/shell/ #啟動mysql-shell mysqlsh 3. 使用 mysq…

漏洞檢測與滲透檢驗在功能及范圍上究竟有何顯著差異?

漏洞檢測與滲透檢驗是確保系統安全的重要途徑&#xff0c;這兩種方法各具特色和功效&#xff0c;它們在功能上有著顯著的差異。 目的不同 漏洞掃描的主要任務是揭示系統內已知的安全漏洞和隱患&#xff0c;這就像是對系統進行一次全面的健康檢查&#xff0c;看是否有已知的疾…

機器學習模型度量指標(混淆矩陣、準確率、精確率、召回率、F1分數、ROC曲線、AUC、平均精度均值)

我們研究的是多分類問題&#xff0c;下面所有例子以多分類問題舉例 混淆矩陣&#xff08;Confusion Matrix&#xff09; 混淆矩陣&#xff08; Confusion Matrix &#xff09;是一個表格&#xff0c;用于可視化機器學習模型在分類問題上 的性能。混淆矩陣的行表示實際類別&…

打卡day35

一、模型結構可視化 理解一個深度學習網絡最重要的2點&#xff1a; 了解損失如何定義的&#xff0c;知道損失從何而來----把抽象的任務通過損失函數量化出來了解參數總量&#xff0c;即知道每一層的設計才能退出—層設計決定參數總量 為了了解參數總量&#xff0c;我們需要知…

時序數據庫 TDengine × Superset:一鍵構建你的可視化分析系統

如果你正在用 TDengine 管理時序數據&#xff0c;寫 SQL 查詢沒問題&#xff0c;但一到展示環節就犯難——圖表太基礎&#xff0c;交互不夠&#xff0c;甚至連團隊都看不懂你辛苦分析的數據成果&#xff1f;別擔心&#xff0c;今天要介紹的這個組合&#xff0c;正是為你量身打造…

C# 初學者的 3 種重構模式

(Martin Fowlers Example) 1. 積極使用 Guard Clause&#xff08;保護語句&#xff09; "如果條件不滿足&#xff0c;立即返回。將核心邏輯放在最少縮進的地方。" 概念定義 Guard Clause&#xff08;保護語句&#xff09; 是一種在函數開頭檢查特定條件是否滿足&a…

基于51單片機和8X8點陣屏、獨立按鍵的滑動躲閃類小游戲

目錄 系列文章目錄前言一、效果展示二、原理分析三、各模塊代碼1、8X8點陣屏2、獨立按鍵3、定時器04、定時器1 四、主函數總結 系列文章目錄 前言 用的是普中A2開發板。 【單片機】STC89C52RC 【頻率】12T11.0592MHz 【外設】8X8點陣屏、獨立按鍵 效果查看/操作演示&#xff…

Java面向對象 一

系列文章目錄 Java面向對象 二-CSDN博客 Java面向對象 三-CSDN博客 目錄 系列文章目錄 前言 一、初步認識面向對象 1.類和對象的簡單理解 2.類的構成 二、類的實例化 1.對象的創建 2.對象的初始化 三、this引用的作用 四、構造方法 1.構造方法的提供 2.對象的構…

深度學習Y8周:yolov8.yaml文件解讀

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 本周任務&#xff1a;根據yolov8n、yolov8s模型的結構輸出&#xff0c;手寫出yolov8l的模型輸出、 文件位置&#xff1a;./ultralytics/cfg/models/v8/yolov8.…

【RocketMQ 生產者和消費者】- 生產者啟動源碼 - MQClientInstance 定時任務(4)

文章目錄 1. 前言2. startScheduledTask 啟動定時任務2.1 fetchNameServerAddr 拉取名稱服務地址2.2 updateTopicRouteInfoFromNameServer 更新 topic 路由信息2.2.1 topic 路由信息2.2.2 updateTopicRouteInfoFromNameServer 獲取 topic2.2.3 updateTopicRouteInfoFromNameSer…