Android中MediaPlayer.TrackInfo.getLanguage()始终返回"und"问题求助
解决MediaPlayer.getTrackInfo().getLanguage()返回"und"的问题
我之前也踩过这个坑!原生MediaPlayer的getLanguage()方法对很多媒体格式的元数据解析支持确实很有限,经常会返回"und"(未确定),哪怕视频文件明明带有明确的语言标记——这不是你的操作问题,更像是Android原生媒体框架的一个局限性,它的底层媒体提取器对某些容器格式(比如MKV、特定编码的MP4)的语言元数据识别逻辑不够完善,而VLC这类第三方播放器用的是自己的解析引擎,所以能正确读取。
给你两个靠谱的解决方案:
方案1:用ExoPlayer替代(推荐)
Google官方现在更推荐用ExoPlayer来处理媒体播放,它对元数据的解析能力比原生MediaPlayer强太多,能正确识别绝大多数媒体文件的音频轨道语言。示例代码如下:
// 初始化ExoPlayer(记得添加ExoPlayer依赖) SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); MediaItem mediaItem = MediaItem.fromUri(yourVideoUri); // 替换成你的视频URI/路径 player.setMediaItem(mediaItem); player.prepare(); // 遍历所有轨道,获取音频轨道的语言 TrackGroupArray trackGroups = player.getCurrentTrackGroups(); for (int groupIdx = 0; groupIdx < trackGroups.length; groupIdx++) { TrackGroup group = trackGroups.get(groupIdx); for (int trackIdx = 0; trackIdx < group.length; trackIdx++) { Format trackFormat = group.getFormat(trackIdx); // 判断是否为音频轨道 if (trackFormat.sampleMimeType != null && trackFormat.sampleMimeType.startsWith("audio/")) { String language = trackFormat.language; // 这里通常能正确拿到"eng"、"rus"这类标准语言代码 Log.d("AudioLang", "音频轨道语言: " + language); } } } // 记得在不需要的时候释放资源 player.release();
方案2:用第三方元数据解析库(如果必须保留MediaPlayer)
如果你的项目暂时无法切换到ExoPlayer,可以用FFmpegMediaMetadataRetriever这个第三方库来单独解析媒体文件的元数据,它基于FFmpeg,能精准识别各种格式的轨道语言信息。示例代码:
FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever(); try { retriever.setDataSource(yourVideoFilePath); // 替换成你的视频路径 int trackCount = Integer.parseInt(retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_TRACK_COUNT)); for (int trackIdx = 0; trackIdx < trackCount; trackIdx++) { String mimeType = retriever.extractMetadataFromTrack(trackIdx, FFmpegMediaMetadataRetriever.METADATA_KEY_MIME_TYPE); if (mimeType != null && mimeType.startsWith("audio/")) { String language = retriever.extractMetadataFromTrack(trackIdx, FFmpegMediaMetadataRetriever.METADATA_KEY_LANGUAGE); Log.d("TrackLang", "轨道" + trackIdx + "语言: " + language); } } } catch (Exception e) { e.printStackTrace(); } finally { retriever.release(); }
为什么原生MediaPlayer不行?
Android原生的MediaPlayer依赖MediaExtractor来读取媒体元数据,但这个提取器只支持少数标准格式的语言标记解析,对于一些非标准或者扩展格式的元数据,就会返回"und"。而VLC等播放器用的是自己的解析逻辑,不受原生框架的限制,所以能正确识别。
内容的提问来源于stack exchange,提问作者Carlos Botero
相关产品推荐
相关产品推荐

