Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Sega71
8 / 2 / 0
Регистрация: 10.08.2011
Сообщений: 65
1

Получение интервала метаданных из потока

20.01.2017, 17:30. Просмотров 317. Ответов 5

Получение интервала метаданных из потока

Как получить название песни?
Пытаюсь прочитать байт размера метаданных из потока http://play.sas-media.ru/play_96.
заголовок потока говорит что будет слать метадату через каждые 16000 байт, т.е. 16001 байт содержит длину метаданных деленную на 16(смотри скрин):
vb.net
1
2
3
4
5
6
7
8
9
10
11
     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
Собственно сам вопрос: Как правильно прочитать этот байт и узнать его значение? Ну и было бы совсем замечательно, если подскажете как получить сами метаданные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2017, 17:30
Ответы с готовыми решениями:

Получение интервала между двумя датами в DGV
Уважаемые форумчане. не могу решить одну проблему. Проблема в том что сравнить...

Получение данных ComboBox из отдельного потока
Необходимость привела к созданию отдельного потока, в коей теме, мягко говоря,...

Получение метаданных audio
Есть код, который отвечает за рандомное проигрывание аудио файлов. Файлы...

Получение метаданных аудиофайла в Qt5 без использования QMediaPlayer?
Здравствуйте. Получить метаданные проигрываемого в данный момент файла легко:...

Получение интервала в удобоваримом виде
хочу проверить когда была внесена последняя запись в базу. запрос SELECT ...

5
MrCrown
823 / 799 / 195
Регистрация: 03.10.2012
Сообщений: 828
21.01.2017, 14:44 2
Sega71, Ваш код не пытался допиливать, пошел по другому пути - просто получил заголовки.
Может этого будет вам достаточно?
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Imports System.Net
Imports System.IO
Imports System.Text
 
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim _Request As HttpWebRequest = HttpWebRequest.Create("http://play.sas-media.ru/play_96")
        Dim _Response As HttpWebResponse = _Request.GetResponse()
 
        For i = 0 To _Response.Headers.Count - 1
            ListBox2.Items.Add(_Response.Headers(i))
        Next
 
        For Each hds As String In _Response.Headers
            ListBox1.Items.Add(hds)
        Next
    End Sub
End Class
0
Миниатюры
Получение интервала метаданных из потока  
MrCrown
823 / 799 / 195
Регистрация: 03.10.2012
Сообщений: 828
21.01.2017, 14:59 3
Название песни - это, кажется здесь
vb.net
1
MsgBox(_Response.Headers("icy-name"))
0
Sega71
8 / 2 / 0
Регистрация: 10.08.2011
Сообщений: 65
24.01.2017, 23:34  [ТС] 4
это заголовки из response, я их и сам получить могу а мне нужно из потока
vb.net
1
remoteStream = response.GetResponseStream()
MrCrown, посмотри сам в заголовках нет названия песни, т.к. оно в потоке, поэтому и надо определить длину и расшифровать.
0
Sega71
8 / 2 / 0
Регистрация: 10.08.2011
Сообщений: 65
24.01.2017, 23:46  [ТС] 5
Пруф:
Кликните здесь для просмотра всего текста
Получение интервала метаданных из потока
0
Sega71
8 / 2 / 0
Регистрация: 10.08.2011
Сообщений: 65
25.01.2017, 22:25  [ТС] 6
Вот нашел пример, может пригодится кому:
Кликните здесь для просмотра всего текста
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
    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
0
25.01.2017, 22:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2017, 22:25

Ошибка Метаданных "не найден идентификатор в справочнике Идентификатор объекта метаданных"
В общем ситуация следующая, только начал разбираться с 1С, скачал с оф сайта...

Получение данных с потока
Подскажите пожалуйста как получать и обрабатывать данные с потока. Есть API,...

Получение состояния потока
Реализую программу, в которой: • создаются два новых потоки; • каждый поток...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru