.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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д