ExoPlayer无法播放本地MOV及远程MOV/本地MP4文件问题咨询
关于ExoPlayer播放本地MOV文件的问题解答
首先明确回答你:ExoPlayer是支持播放本地MOV文件的,你遇到的UnrecognizedInputFormatException异常,大概率是文件编码、读取权限或文件本身的问题,而非ExoPlayer不支持MOV容器本身。
为什么会抛出这个异常?
MOV本质是QuickTime容器格式,ExoPlayer的Mp4Extractor(你异常信息里列出的Extractors之一)是支持解析MOV容器的。抛出该异常通常意味着:
- 文件的视频/音频编码不在ExoPlayer支持的范围内
- App没有足够的权限读取本地文件
- 文件本身损坏或格式不标准
- 自定义了ExtractorsFactory,意外排除了
Mp4Extractor
排查和解决步骤
检查文件编码兼容性:
MOV只是容器,里面的视频(比如ProRes、H.264)和音频(比如PCM、AAC)编码才是关键。ExoPlayer默认支持H.264/H.265视频编码,以及AAC/MP3/PCM等音频编码。如果你的MOV用了ProRes这类特殊编码,需要引入ExoPlayer的扩展库(比如exoplayer-ext-prores)才能支持。你可以用MediaInfo这类工具查看文件的编码信息。确认本地文件读取权限:
- Android 9及以下:确保App申请了
READ_EXTERNAL_STORAGE权限,并且用户已授权。 - Android 10及以上:建议使用Scoped Storage,通过
ContentResolver获取文件Uri,不要直接使用文件路径(直接用路径可能会因为权限限制导致无法读取文件内容,Extractor无法解析)。
- Android 9及以下:确保App申请了
验证ExoPlayer配置和版本:
- 确保使用的是ExoPlayer最新稳定版,旧版本可能对某些MOV变种支持不足。
- 检查是否自定义了
ExtractorsFactory,如果是,要确保包含Mp4Extractor(默认配置已经包含,除非你主动移除)。
测试标准MOV文件:
找一个标准的MOV文件(比如用手机拍摄的MOV,一般是H.264+AAC编码)进行测试,排除你当前文件损坏或格式异常的问题。
正确加载本地MOV的代码示例
Android 9及以下(文件路径方式)
val file = File(Environment.getExternalStorageDirectory().absolutePath, "test.mov") val mediaItem = MediaItem.fromUri(Uri.fromFile(file)) player.setMediaItem(mediaItem) player.prepare() player.play()
Android 10及以上(Scoped Storage方式,通过文件选择器获取Uri)
// 假设从文件选择器的返回结果中获取Uri val selectedUri = data?.data ?: return val mediaItem = MediaItem.fromUri(selectedUri) player.setMediaItem(mediaItem) player.prepare() player.play()
内容的提问来源于stack exchange,提问作者Gurpreet Kaur
相关产品推荐
相关产品推荐

