.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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.5 из 5