使用 VideoView 或 MediaPlayer 播放本地視頻時,提示「視頻不存在」或「無法播放」,即使代碼邏輯正確。
最常見原因是路徑錯誤。請按以下優先級嘗試:
// 1. 絕對路徑(需運行時權限)
String path = "/sdcard/Download/test.mp4";
// 2. 應用私有目錄(無需權限)
String path = getFilesDir() + "/test.mp4";
// 3. 原始資源目錄
String path = "android.resource://" + getPackageName() + "/" + R.raw.test;
// 4. 網絡視頻驗證編碼器支持
String url = "https://example.com/test.mp4";
| 特性 | 3gp | mp4 (H.264/AAC) |
|---|---|---|
| Android 支持度 | 早期版本廣泛支持 | Android 3.0+ 完美支持 |
| 編碼複雜度 | 低(H.263/AMR) | 高(H.264/AAC) |
| 畫質/壓縮比 | 較差 | 優秀 |
| 推薦場景 | 極低端設備兼容 | 現代開發首選 |
建議:統一使用 MP4 (H.264 Baseline Profile + AAC LC),兼容性最佳。
VideoView videoView = findViewById(R.id.videoView);
// 必須設置 MediaController 才能顯示控制條
videoView.setMediaController(new MediaController(this));
// 設置路徑
videoView.setVideoPath(localPath); // 或 setVideoURI(Uri.parse(url))
// 關鍵:設置準備完成監聽器,捕獲錯誤
videoView.setOnPreparedListener(mp -> {
videoView.start();
});
videoView.setOnErrorListener((mp, what, extra) -> {
Log.e("VideoError", "what=" + what + ", extra=" + extra);
// what=1: 未知錯誤; what=-38: 文件不存在/路徑錯誤
return true; // 消費錯誤,不顯示默認對話框
});
MANAGE_EXTERNAL_STORAGE 或使用 MediaStore API。90% 的「視頻不存在」實為 路徑錯誤或權限不足。優先用網絡視頻驗證播放器,再排查本地路徑;統一採用 MP4 格式,配合 OnErrorListener 精確定位錯誤碼。