.NET 4.x Получение интервала метаданных из потока - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Как получить название песни? Пытаюсь прочитать байт размера метаданных из потока http://play.sas-media.ru/play_96. заголовок потока говорит что будет слать метадату через каждые 16000 байт, т.е. 16001 байт содержит длину метаданных деленную на 16(смотри скрин):
Листинг программы
  1. If response.Headers("icy-metaint") <> 0 Then ' icy-metaint = 16000
  2. remoteStream = response.GetResponseStream()
  3. Dim readbufsize(16000) As Byte '16001
  4. Dim readedbytes As Integer = 0
  5. Dim strRead As String
  6. readedbytes = remoteStream.Read(readbufsize, 16000, 1)
  7. Dim localStream As MemoryStream = New MemoryStream
  8. localStream.Write(readbufsize, 0, readedbytes)
  9. strRead = Encoding.ASCII.GetString(localStream.ToArray)
  10. Console.WriteLine(strRead)
  11. End If
Собственно сам вопрос: Как правильно прочитать этот байт и узнать его значение? Ну и было бы совсем замечательно, если подскажете как получить сами метаданные.

Решение задачи: «.NET 4.x Получение интервала метаданных из потока»

textual
Листинг программы
  1.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  2.         ' examplestream: http://205.188.215.229:8002"
  3.         Dim server As String = "http://play.sas-media.ru/play_96"
  4.         ' destination path for saved songs
  5.         Dim request As HttpWebRequest = Nothing
  6.         ' web request
  7.         Dim response As HttpWebResponse = Nothing
  8.         ' web response
  9.         Dim metaInt As Integer = 0
  10.         ' blocksize of mp3 data
  11.         Dim count As Integer = 0
  12.         ' byte counter
  13.         Dim metadataLength As Integer = 0
  14.         ' length of metadata header
  15.         Dim metadataHeader As String = ""
  16.         ' previous metadata header, to compare with new header and find next song
  17.         Dim buffer As Byte() = New Byte(511) {}
  18.         ' receive buffer
  19.         Dim socketStream As Stream = Nothing
  20.         ' input stream on the web request
  21.         Dim byteOut As Stream = Nothing
  22.         ' output stream on the destination file
  23.         ' create web request
  24.         request = DirectCast(WebRequest.Create(server), HttpWebRequest)
  25.  
  26.         ' clear old request header and build own header to receive ICY-metadata
  27.         request.Headers.Clear()
  28.         'request.Headers.Add("GET", serverPath + " HTTP/1.0");
  29.         request.Headers.Add("Icy-MetaData", "1")
  30.         ' needed to receive metadata informations
  31.         request.UserAgent = "WinampMPEG/5.09"
  32.  
  33.         ' execute request
  34.         Try
  35.             response = DirectCast(request.GetResponse(), HttpWebResponse)
  36.         Catch ex As Exception
  37.             MessageBox.Show(ex.Message)
  38.             Return
  39.         End Try
  40.  
  41.         ' read blocksize to find metadata header
  42.         metaInt = Convert.ToInt32(response.GetResponseHeader("icy-metaint"))
  43.  
  44.         Try
  45.             ' open stream on response
  46.             socketStream = response.GetResponseStream()
  47.  
  48.             ' rip stream in an endless loop
  49.             While True
  50.                 ' read byteblock
  51.                 Dim bufLen As Integer = socketStream.Read(buffer, 0, buffer.Length)
  52.                 If bufLen < 0 Then
  53.                     Return
  54.                 End If
  55.  
  56.                 For i As Integer = 0 To bufLen - 1
  57.                     ' if there is a header, the 'headerLength' would be set to a value != 0. Then we save the header to a string
  58.                     If metadataLength <> 0 Then
  59.                         metadataHeader += Convert.ToChar(buffer(i))
  60.                         metadataLength -= 1
  61.                         '
  62.                         If metadataLength = 0 Then
  63.                             Console.WriteLine(metadataHeader)
  64.                             Exit While
  65.                         End If
  66.                     Else
  67.                         ' write mp3 data to file or extract metadata headerlength
  68.                         If System.Math.Max(System.Threading.Interlocked.Increment(count), count - 1) < metaInt Then
  69.                             ' write bytes to filestream
  70.                             If byteOut IsNot Nothing Then
  71.                                 ' as long as we don't have a songtitle, we don't open a new file and don't write any bytes
  72.                                 byteOut.Write(buffer, i, 1)
  73.                                 If count Mod 100 = 0 Then
  74.                                     byteOut.Flush()
  75.                                 End If
  76.                             End If
  77.                         Else
  78.                             ' get headerlength from lengthbyte and multiply by 16 to get correct headerlength
  79.                             metadataLength = Convert.ToInt32(buffer(i)) * 16
  80.                             count = 0
  81.                         End If
  82.                     End If
  83.                 Next
  84.             End While
  85.         Catch ex As Exception
  86.             MessageBox.Show(ex.Message, "Error")
  87.         Finally
  88.             If byteOut IsNot Nothing Then
  89.                 byteOut.Close()
  90.             End If
  91.             If socketStream IsNot Nothing Then
  92.                 socketStream.Close()
  93.             End If
  94.         End Try
  95.     End Sub

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут