Media3 ExoPlayer getMediaMetadata()无法获取正确歌曲元数据
在线电台ExoPlayer获取歌曲标题解决方案
在线电台的歌曲元数据大多通过**ICY协议(Shoutcast/Icecast)**动态推送,和本地媒体文件的静态元数据逻辑不同,你之前依赖onMediaMetadataChanged获取的是媒体文件的静态元数据,而实时歌曲信息需要通过专门的ICY元数据监听来获取。以下是具体解决步骤:
1. 配置支持ICY元数据的数据源工厂
替换原有的播放器初始化代码,显式开启ExoPlayer对ICY元数据的解析:
// 创建支持ICY元数据的Http数据源工厂 HttpDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory() .setAllowCrossProtocolRedirects(true) // 监听电台基本信息(可选) .setIcyHeadersListener(icyHeaders -> { String stationName = icyHeaders.getName(); String genre = icyHeaders.getGenre(); }) // 监听实时更新的歌曲元数据 .setIcyMetadataListener((metadata, durationMs) -> { String streamTitle = metadata.getStreamTitle(); if (streamTitle != null && !streamTitle.isEmpty()) { // 多数电台的streamTitle格式为 "艺术家 - 歌曲名",可按需拆分 String[] titleParts = streamTitle.split(" - ", 2); if (titleParts.length == 2) { String artist = titleParts[0]; String songTitle = titleParts[1]; viewSong.setText(songTitle); // 可额外处理艺术家信息 } else { viewSong.setText(streamTitle); } } }); // 初始化播放器时绑定自定义数据源工厂 player = new ExoPlayer.Builder(this) .setMediaSourceFactory(new ProgressiveMediaSource.Factory(dataSourceFactory)) .build(); MediaItem mediaItem = MediaItem.fromUri(link); player.setMediaItem(mediaItem); player.prepare(); player.play();
2. 关键逻辑说明
- 放弃依赖
Player.Listener的onMediaMetadataChanged回调:该回调仅针对静态媒体文件的元数据,无法获取电台实时推送的歌曲信息。 - 启用
setIcyMetadataListener:直接监听ICY协议推送的实时元数据,这也是VLC能正常获取歌曲信息的核心逻辑。 - 适配不同元数据格式:部分电台的
streamTitle格式可能不统一,可根据实际返回值调整拆分逻辑,或直接显示完整标题。
3. 额外检查点
- 确认电台链接支持ICY元数据:部分低版本电台可能未开启该功能,可换用已知支持的测试链接验证。
- 确保依赖版本正确:使用最新版ExoPlayer(建议2.18+),旧版本可能存在ICY解析兼容性问题。
内容的提问来源于stack exchange,提问作者Z Ivanov
相关产品推荐
相关产品推荐

