首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android MediaPlayer 播放大型 MP4 影片遭遇 TransactionTooLargeException 解決方案

     編輯:程式設計疑難解答

問題背景

在 Android 應用中使用 MediaPlayer 搭配 SurfaceView 播放本地影片時,小型 MP4 檔案播放正常,但嘗試播放 1.4GB 的大型 MP4 檔案時,prepareAsync() 會拋出 TransactionTooLargeException 異常,導致影片無法載入播放。

核心原因

MediaPlayer 的 prepareAsync() 在處理大型媒體檔案時,需要在 Binder 交易中傳遞大量資料,超過了 Android IPC 的大小限制(通常為 1MB),因而觸發 TransactionTooLargeException。這是一個已知的系統限制,並非程式碼邏輯錯誤。

解決策略

  1. 使用 MediaPlayer 的 setDataSource(FileDescriptor) 重載:透過 FileInputStream 取得 FileDescriptor,避免傳遞完整路徑字串,減少 Binder 資料量。
  2. 採用 ExoPlayer 或 Media3 庫:Google 官方推薦的媒體播放庫,支援大型檔案串流播放、自適應碼率,且不受 MediaPlayer 的 IPC 限制。
  3. 分割影片或降低解析度:若業務允許,將大型影片拆分為多個較小片段,或提供較低解析度版本供行動裝置播放。

程式碼示範:使用 FileDescriptor

FileInputStream fis = new FileInputStream(file);
FileDescriptor fd = fis.getFD();
mediaPlayer.setDataSource(fd);
fis.close(); // 關閉串流,但 FileDescriptor 仍有效
mediaPlayer.prepareAsync();

最佳實踐建議

  • 優先遷移至 ExoPlayer (Media3),獲得更穩定的大型媒體播放體驗。
  • 在 AndroidManifest.xml 中宣告 android:largeHeap="true" 可緩解記憶體壓力,但無法解決 IPC 限制。
  • 播放前檢查檔案大小,超過閾值時自動切換至 ExoPlayer 播放路徑。

參考資源:相關技術部落格

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved