.NET 4.x Получение интервала метаданных из потока - Visual Basic .NET
Формулировка задачи:
Как получить название песни?
Пытаюсь прочитать байт размера метаданных из потока http://play.sas-media.ru/play_96.
заголовок потока говорит что будет слать метадату через каждые 16000 байт, т.е. 16001 байт содержит длину метаданных деленную на 16(смотри скрин):
Собственно сам вопрос: Как правильно прочитать этот байт и узнать его значение? Ну и было бы совсем замечательно, если подскажете как получить сами метаданные.
Листинг программы
- If response.Headers("icy-metaint") <> 0 Then ' icy-metaint = 16000
- remoteStream = response.GetResponseStream()
- Dim readbufsize(16000) As Byte '16001
- Dim readedbytes As Integer = 0
- Dim strRead As String
- readedbytes = remoteStream.Read(readbufsize, 16000, 1)
- Dim localStream As MemoryStream = New MemoryStream
- localStream.Write(readbufsize, 0, readedbytes)
- strRead = Encoding.ASCII.GetString(localStream.ToArray)
- Console.WriteLine(strRead)
- End If
Решение задачи: «.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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д