.NET 4.x Получение интервала метаданных из потока - Visual Basic .NET
Формулировка задачи:
Как получить название песни?
Пытаюсь прочитать байт размера метаданных из потока http://play.sas-media.ru/play_96.
заголовок потока говорит что будет слать метадату через каждые 16000 байт, т.е. 16001 байт содержит длину метаданных деленную на 16(смотри скрин):
Собственно сам вопрос: Как правильно прочитать этот байт и узнать его значение? Ну и было бы совсем замечательно, если подскажете как получить сами метаданные.
Решение задачи: «.NET 4.x Получение интервала метаданных из потока»
textual
Листинг программы
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' examplestream: http://205.188.215.229:8002"
Dim server As String = "http://play.sas-media.ru/play_96"
' destination path for saved songs
Dim request As HttpWebRequest = Nothing
' web request
Dim response As HttpWebResponse = Nothing
' web response
Dim metaInt As Integer = 0
' blocksize of mp3 data
Dim count As Integer = 0
' byte counter
Dim metadataLength As Integer = 0
' length of metadata header
Dim metadataHeader As String = ""
' previous metadata header, to compare with new header and find next song
Dim buffer As Byte() = New Byte(511) {}
' receive buffer
Dim socketStream As Stream = Nothing
' input stream on the web request
Dim byteOut As Stream = Nothing
' output stream on the destination file
' create web request
request = DirectCast(WebRequest.Create(server), HttpWebRequest)
' clear old request header and build own header to receive ICY-metadata
request.Headers.Clear()
'request.Headers.Add("GET", serverPath + " HTTP/1.0");
request.Headers.Add("Icy-MetaData", "1")
' needed to receive metadata informations
request.UserAgent = "WinampMPEG/5.09"
' execute request
Try
response = DirectCast(request.GetResponse(), HttpWebResponse)
Catch ex As Exception
MessageBox.Show(ex.Message)
Return
End Try
' read blocksize to find metadata header
metaInt = Convert.ToInt32(response.GetResponseHeader("icy-metaint"))
Try
' open stream on response
socketStream = response.GetResponseStream()
' rip stream in an endless loop
While True
' read byteblock
Dim bufLen As Integer = socketStream.Read(buffer, 0, buffer.Length)
If bufLen < 0 Then
Return
End If
For i As Integer = 0 To bufLen - 1
' if there is a header, the 'headerLength' would be set to a value != 0. Then we save the header to a string
If metadataLength <> 0 Then
metadataHeader += Convert.ToChar(buffer(i))
metadataLength -= 1
'
If metadataLength = 0 Then
Console.WriteLine(metadataHeader)
Exit While
End If
Else
' write mp3 data to file or extract metadata headerlength
If System.Math.Max(System.Threading.Interlocked.Increment(count), count - 1) < metaInt Then
' write bytes to filestream
If byteOut IsNot Nothing Then
' as long as we don't have a songtitle, we don't open a new file and don't write any bytes
byteOut.Write(buffer, i, 1)
If count Mod 100 = 0 Then
byteOut.Flush()
End If
End If
Else
' get headerlength from lengthbyte and multiply by 16 to get correct headerlength
metadataLength = Convert.ToInt32(buffer(i)) * 16
count = 0
End If
End If
Next
End While
Catch ex As Exception
MessageBox.Show(ex.Message, "Error")
Finally
If byteOut IsNot Nothing Then
byteOut.Close()
End If
If socketStream IsNot Nothing Then
socketStream.Close()
End If
End Try
End Sub