VB.Net - 音频文件专辑艺术
Posted
技术标签:
【中文标题】VB.Net - 音频文件专辑艺术【英文标题】:VB.Net - Audio Files Album Arts 【发布时间】:2015-01-21 02:19:01 【问题描述】:基本上我很绝望。
我已经尝试了所有关于这个问题的 Google 结果。
我有一个与 WMP 非常相似的程序。它使用axWMP控件播放歌曲等。
我有许多类型的音频文件,mp3、m4a、wma 等。我已经成功编写了一些代码来获取标签:曲目#、标题、专辑、艺术家、年份。唯一我似乎无法正确完成的是专辑封面。
我使用的代码仅适用于某些 mp3 文件。当然是因为我用的是 UltraID3,而且它只适用于 mp3。
代码如下:
Dim MP3Tag As New UltraID3
albumArt = Nothing
Try
MP3Tag.Read(path)
Try
Dim pics = MP3Tag.ID3v2Tag.Frames.GetFrames(CommonMultipleInstanceID3v2FrameTypes.Picture)
albumArt = CType(pics(0), ID3v2PictureFrame).Picture
Catch ex As Exception
'albumArt = FetchAlbumImage(j, path)
End Try
Catch ex As Exception
End Try
但后来我尝试通过 WMP 控件本身获取专辑封面,就像我为其余标签所做的那样:
Function FetchAlbumArt(index As Integer, filePath As String) As Image
FetchAlbumArt = Nothing
Dim pic As WMPLib.IWMPMetadataPicture = Nothing
Dim tWMP As New WindowsMediaPlayer
tWMP.currentMedia = Me.WMP.currentPlaylist.Item(index)
For i = 0 To tWMP.currentMedia.getAttributeCountByType("WM/Picture", "")
Try
pic = tWMP.currentMedia.getItemInfoByType("WM/Picture", "", i)
Exit For
Catch ex As Exception
Debug.Print(Err.Description)
End Try
Next
If Not IsNothing(pic) Then
Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache)
Dim fInfo, fInfos() As IO.FileInfo
Dim dInfo As IO.DirectoryInfo
dInfo = New IO.DirectoryInfo(path)
fInfos = dInfo.GetFiles("*" & FindStringBeforeLastIndexOfChar(FindStringAfterLastIndexOfChar(pic.URL, "/"), ".", False) & "*", IO.SearchOption.AllDirectories)
For Each fInfo In fInfos
If fInfo.Name Like "*" & FindStringBeforeLastIndexOfChar(FindStringAfterLastIndexOfChar(pic.URL, "/"), ".", False) & "*" Then
System.IO.File.Copy(fInfo.FullName, dbFolderPath & "\temp.jpg", True)
End If
Next
Dim albumArt As Image
albumArt = Bitmap.FromFile(dbFolderPath & "\temp.jpg")
FetchAlbumArt = albumArt
End If
End Function
此功能进入 Internet Explorer 临时文件夹并将图像复制到外部以使用它。它有效,但同样只适用于相同的 mp3 文件。
我已阅读有关可用于 m4a 文件的 Apple Quick Time 控件,但我无法从中得到任何东西。
真正困扰我的一件事是它适用于 mp3,但不是全部。
我知道它为什么不起作用的唯一线索是:“索引超出范围。必须是非负数并且小于集合的大小。 参数名称:索引”在上面的 MP3Tag.Read(path) 行和“参数不正确。 (HRESULT 的例外情况:0x80070057 (E_INVALIDARG))" on line pic = tWMP.currentMedia.getItemInfoByType("WM/Picture", "", i) 用于文件不工作的 mp3 或其他文件格式。
我知道这并非不可能,因为 WMP 12 本身可以很好地显示任何文件的专辑封面。
感谢您帮助我。
【问题讨论】:
【参考方案1】:WMP 将其专辑封面存储在%LOCALAPPDATA%\Microsoft\Media Player\Art Cache\LocalMLS
文件夹中。此文件夹中 JPEG 文件的文件名对应于库中 WMP 媒体项的TrackingID 属性。
【讨论】:
以上是关于VB.Net - 音频文件专辑艺术的主要内容,如果未能解决你的问题,请参考以下文章
将元数据标签(如标题、艺术家、专辑)添加到音频文件不起作用(Android MediaStore)
使用 youtube-dl 将元数据(艺术家姓名、歌曲名称、年份、专辑、时长、流派)写入 mp3/m4a 音频文件(随后的 AtomicParsely 错误)