在 Android 應用中使用 MediaPlayer 搭配 SurfaceView 播放本地影片時,小型 MP4 檔案播放正常,但嘗試播放 1.4GB 的大型 MP4 檔案時,prepareAsync() 會拋出 TransactionTooLargeException 異常,導致影片無法載入播放。
MediaPlayer 的 prepareAsync() 在處理大型媒體檔案時,需要在 Binder 交易中傳遞大量資料,超過了 Android IPC 的大小限制(通常為 1MB),因而觸發 TransactionTooLargeException。這是一個已知的系統限制,並非程式碼邏輯錯誤。
FileInputStream 取得 FileDescriptor,避免傳遞完整路徑字串,減少 Binder 資料量。FileInputStream fis = new FileInputStream(file);
FileDescriptor fd = fis.getFD();
mediaPlayer.setDataSource(fd);
fis.close(); // 關閉串流,但 FileDescriptor 仍有效
mediaPlayer.prepareAsync();
AndroidManifest.xml 中宣告 android:largeHeap="true" 可緩解記憶體壓力,但無法解決 IPC 限制。參考資源:相關技術部落格