使用 MediaMetadataRetriever 提取元数据有意外结果

Posted

技术标签:

【中文标题】使用 MediaMetadataRetriever 提取元数据有意外结果【英文标题】:Extracting of MetaData with MediaMetadataRetriever has unexpected result 【发布时间】:2014-01-10 02:02:31 【问题描述】:

我正在尝试为 android 构建自己的音乐播放器。

对于列表,我需要歌曲的元数据,因此我使用MediaMetadataRetriever 来提取它们,但检索器无法提取大多数歌曲的元数据(669 首歌曲中的约 630 首)。在我的 PC 音乐软件中,元数据是可见的,在 Windows 资源管理器中也是如此。如果我打开歌曲的属性,我可以修改它们,如果我在手机上加载更改的文件,它仍然不起作用。顺便说一句:如果我在手机上使用任何其他播放器,它总是能够加载元数据。

MediaMetadataRetriever 有问题吗?我应该使用其他库进行提取还是我做错了什么?

This 问题是相关的,但并不能真正帮助解决我的问题。

这里以我的一些代码为例:

MediaMetadataRetriever lMetaData = new MediaMetadataRetriever();
lMetaData.setDataSource(mAbsolutePath);
mArtist = lMetaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
mTitle = lMetaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
mAlbum = lMetaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
mAlbumArtist = lMetaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST);
mGenre = lMetaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);
mSongNumber = lMetaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER);
mYear = lMetaData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR);

if(mArtist == null)
    mArtist = new String("");
if(mTitle == null) 
    mTitle = new String("");
if(mAlbum == null) 
    mAlbum = new String("");
if(mAlbumArtist == null) 
    mAlbumArtist = new String("");
if(mGenre == null) 
    mGenre = new String("");
if(mSongNumber == null) 
    mSongNumber = new String("");
if(mYear == null) 
    mYear = new String("");

【问题讨论】:

我只是为标签使用了另一个外部库,所以问题已经解决了。 【参考方案1】:

MediaMetadataRetriever 仅支持少数几种格式。我推荐FFmpegMediaMetadataRetriever。它支持多种其他格式和协议。

【讨论】:

以上是关于使用 MediaMetadataRetriever 提取元数据有意外结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 MediaMetadataRetriever 提取元数据有意外结果

【Android音视频】MediaMetadataRetriever使用

获取 mediaMetadataRetriever.setDataSource 抛出非法参数异常

Android 2.2 和 2.3 中的 MediaMetadataRetriever

Android 2.2 和 2.3 中的 MediaMetadataRetriever

MediaExtractor、带有原始/资产文件的 MediaMetadataRetriever