VB.Net - 音频文件专辑艺术

时间:2015-01-21 02:19:02

标签: vb.net audio mp3 albumart id3v2

基本上我很绝望。

我已经尝试过我在每个Google搜索结果中看到的有关此问题的所有信息。

我有一个与WMP非常相似的程序。它使用axWMP控件播放歌曲等。

我有很多类型的音频文件,mp3,m4a,wma等。我已经成功编写了一些东西来获取标签:track#,title,album,artist,year。我唯一无法正确完成的是专辑封面。

我使用的代码仅适用于某些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(路径)上面和”参数不正确。 (来自HRESULT的异常:0x80070057(E_INVALIDARG))“在线pic = tWMP.currentMedia.getItemInfoByType(”WM / Picture“,”“,i),无论何时文件都是无效的mp3或其他文件格式。

我知道这并非不可能,因为WMP 12本身可以为任何文件显示专辑艺术。

感谢您帮助我。

1 个答案:

答案 0 :(得分:0)

WMP将其专辑封面存储在%LOCALAPPDATA%\Microsoft\Media Player\Art Cache\LocalMLS文件夹中。此文件夹中JPEG文件的文件名对应于库中WMP媒体项的TrackingID属性。