VB.net中的ID3标记

时间:2012-02-25 10:59:47

标签: vb.net filestream id3

有人可以告诉我以下代码有什么问题吗?

    Dim mp As FileStream
    Dim Title(30) As Byte
    mp = New FileStream(My.Computer.FileSystem.SpecialDirectories.MyMusic & "\Set List Planner\Tracks" & filename, FileMode.Open)
    mp.Seek(-125, SeekOrigin.End)
    mp.Read(Title, 0, 30)

    Me.songName = System.Text.Encoding.ASCII.GetString(Title)

在第4行,我一直得到:

  

尝试在文件开头之前移动文件指针。

2 个答案:

答案 0 :(得分:2)

你真的应该考虑使用TagLib#来读写ID3标签。然后它就像:

一样简单
Dim _MP3FilePath As String = My.Computer.FileSystem.SpecialDirectories.MyMusic & "\Set List Planner\Tracks" & filename
Dim _MP3File As TagLib.File = TagLib.File.Create(_MP3FilePath)
Me.songname = _MP3File.Tag.Title

要引用taglib sharp库,必须先通过NuGet安装它。要安装TagLib#,请在Visual Studio中的程序包管理器控制台中运行以下命令。

PM> Install-Package taglib

可以在http://nuget.org/packages/taglib找到taglib-sharp的NuGet分布。官方源代码存储库位于https://github.com/mono/taglib-sharp

答案 1 :(得分:1)

我的猜测是你的文件长度不到125个字节。您试图在文件结束之前将流位置移动125个字节。在尝试移动您的流位置之前,我会检查文件的Length。如:

Dim mp As FileStream
Dim Title(30) As Byte
mp = New FileStream(My.Computer.FileSystem.SpecialDirectories.MyMusic & "\Set List Planner\Tracks" & filename, FileMode.Open)
If mp.Length >= 125 Then
    mp.Seek(-125, SeekOrigin.End)
    mp.Read(Title, 0, 30)
    Me.songName = System.Text.Encoding.ASCII.GetString(Title)
End If

只是暂且不过我尝试使用Mp3示例代码,以确保我没有轻率,它确实提取了歌曲的标题。我想重申一下,在进行Seek之前,您需要验证流的长度。例如,我使用的歌曲的长度是8414449。