Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
 Аватар для tresh
6 / 6 / 0
Регистрация: 12.06.2011
Сообщений: 37

Запись звука с потока и-нет радио

04.08.2011, 22:03. Показов 6872. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, в своем приложении играю радио с помощю wmp. Есть необходимость захватывать поток. Как только не пробовал, сколько библиотек не перерыл - не катит. Пробовал захватить тупо с звуковой, но на вин 7 как-то тупо все сделано... Вопрос:
1. Как записать с потока радио?
bass.net не придлагать, тупая картинка, что вылетает при запуске уже достала...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.08.2011, 22:03
Ответы с готовыми решениями:

Размножение радио-потока
Доброе время суток. Необходимо "размножить" существующий радио-поток, возможно ли сделать это в рамках возможностей предоставляемых...

Информация с радио потока
Здравствуйте. Подскажите возможно ли с радио потока получать название песни и исполнителя. Запускаю проигрывание простым скриптом: ...

Выбор радио-потока на сайте
Есть скрипт потокового радио, точнее флеш плеер который умеет воспроизводить потоковое вещание на сайте. Подключается он так <div...

14
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
04.08.2011, 22:31
слышал только об одной идее - сначала передавать поток через сокет в файл на локальном диске, а потом проигрывать на плеере с локального диска.
1
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
05.08.2011, 02:30
Используя NAudio:

C#
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
   private Stream ms = new MemoryStream();
    public void PlayMp3FromUrl(string url)
    {
        new Thread(delegate(object o)
                       {
                            var response = WebRequest.Create(url).GetResponse();
                            using (var stream = response.GetResponseStream())
                            {
                                byte[] buffer = new byte[65536]; // 64KB chunks
                                int read;
                                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                                {
                                    var pos = ms.Position;
                                    ms.Position = ms.Length;
                                    ms.Write(buffer, 0, read);
                                    ms.Position = pos;
                                }
                            }
                       }).Start();
 
        // Pre-buffering some data to allow NAudio to start playing
        while (ms.Length < 65536*10)
            Thread.Sleep(1000);
 
        ms.Position = 0;
        using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms))))
        {
            using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
            {
                waveOut.Init(blockAlignedStream);
                waveOut.Play();
                while (waveOut.PlaybackState == PlaybackState.Playing)
                {
                    System.Threading.Thread.Sleep(100);
                }
            }
        }
    }
0
 Аватар для tresh
6 / 6 / 0
Регистрация: 12.06.2011
Сообщений: 37
05.08.2011, 20:55  [ТС]
Цитата Сообщение от Unril Посмотреть сообщение
Используя NAudio:

C#
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
   private Stream ms = new MemoryStream();
    public void PlayMp3FromUrl(string url)
    {
        new Thread(delegate(object o)
                       {
                            var response = WebRequest.Create(url).GetResponse();
                            using (var stream = response.GetResponseStream())
                            {
                                byte[] buffer = new byte[65536]; // 64KB chunks
                                int read;
                                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                                {
                                    var pos = ms.Position;
                                    ms.Position = ms.Length;
                                    ms.Write(buffer, 0, read);
                                    ms.Position = pos;
                                }
                            }
                       }).Start();
 
        // Pre-buffering some data to allow NAudio to start playing
        while (ms.Length < 65536*10)
            Thread.Sleep(1000);
 
        ms.Position = 0;
        using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms))))
        {
            using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
            {
                waveOut.Init(blockAlignedStream);
                waveOut.Play();
                while (waveOut.PlaybackState == PlaybackState.Playing)
                {
                    System.Threading.Thread.Sleep(100);
                }
            }
        }
    }
ну и что код делает? у меня просто прога висит, потому что что-то выполняеться в потоке... непонимаю. можно немножко подробней?
0
 Аватар для CLEO_ROCK
71 / 71 / 23
Регистрация: 22.05.2011
Сообщений: 528
06.08.2011, 00:42
мне кажется висит изза этих строчек:
C#
1
2
while (ms.Length < 65536*10)
       Thread.Sleep(1000);
это получается надо ждать 182 часа...хз зачем) сам код не понимаю, NAudio никогда не юзал
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
06.08.2011, 01:01
А в режиме отладки посмотреть нельзя? Подозреваю просто надо весь код поместить внутрь анонимного метода, то есть: }).Start(); перенести почти в самый низ. Ну это на первый взгляд, если всё же надумаю затестить код, то отпишу как сделать, чтобы работал, так как интересует работа со звуком.

Добавлено через 2 минуты
Цитата Сообщение от CLEO_ROCK Посмотреть сообщение
мне кажется висит изза этих строчек:
C#
1
2
while (ms.Length < 65536*10)
       Thread.Sleep(1000);
это получается надо ждать 182 часа...хз зачем) сам код не понимаю, NAudio никогда не юзал
Как я понял это типа пока не загрузит 640 килобайт, то не начинать воспроизведение. Только повторю, такой код имеет смысл внутри анонимного метода, а не вне его пределов (на первый взгляд).

Добавлено через 8 минут
А нет, затупил, не надо помещать внутрь анонимного метода.

Добавлено через 1 минуту
Просто нужно создать класс скажем Player и воспроизводить в новом потоке (внутри Player), а этот поток в свою очередь создаст ещё один, как и показано в методе, это опять же не тестил, но думаю скорее всего так и есть. А то что прога виснет, дык в GUI потоке, если метод вызывать оно и будет виснуть.
0
 Аватар для tresh
6 / 6 / 0
Регистрация: 12.06.2011
Сообщений: 37
06.08.2011, 17:00  [ТС]
может кто-нибудь потестить и сделать код рабочим? ато у меня никак не получаеться...
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
07.08.2011, 00:24
Короче попробовал замутить что-то. Так то работает, но у меня сомнения насчёт потоков (так ли вообще сделал). Пробовал перед уничтожением останавливать воспроизведение, если играет, закрывать потоки, но постоянно вылетали какие-то ошибки, типа поток не может получить доступ к ликвидированному объекту (что-то типа того), ладно всё удалил это, написал тупо закрытие 2-ух потоков, всё стало работать, но я сомневаюсь, что надо именно так делать. Так-что если тут есть, кто в этом деле шарит, было бы интересно услышать где ошибки, что и как можно исправить.

Не по теме:

А так я сомневаюсь, что кто-то будет заморачиваться, тема скорее всего умрёт (обычно так и бывает)

Вложения
Тип файла: rar Wpf_Test_NAudio_Player.rar (141.5 Кб, 127 просмотров)
1
 Аватар для tresh
6 / 6 / 0
Регистрация: 12.06.2011
Сообщений: 37
13.08.2011, 23:50  [ТС]
Обошел проблему стороной... сделал запись эфира и-нет радио через скачку самого потока в файл
C#
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
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        private void button4_Click(object sender, EventArgs e)
        {
            saveFileDialog1.Title = "Select output file:";
            saveFileDialog1.Filter = "mp3 Files (*.mp3)|*.mp3";
            //saveFileDialog.FileName = outputFilename;
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox2.Text = saveFileDialog1.FileName;
                button5.Enabled = true;
 
            }
        }
        WebClient potok = new WebClient();
        
        private void button5_Click(object sender, EventArgs e)
        {
            // Create a new thread that calls the Download() method
            thrDownload = new Thread(Download);
            // Start the thread, and thus call Download()
            thrDownload.Start();
            button5.Enabled = false;
            button6.Enabled = true;
 
 
 
 
           /* string pathtext = Path.GetFileName(saveFileDialog1.FileName);
            potok.DownloadFile("http://radio.rpgfm.ru:8000/live", pathtext);*/
        }
 
        private void button6_Click(object sender, EventArgs e)
        {
            webResponse.Close();
            strResponse.Close();
            strLocal.Close();
            // Abort the thread that's downloading
            thrDownload.Abort();
            button5.Enabled = true;
            button6.Enabled = false;
            textBox2.Clear();
            
        }
 
 
        private void Download()
        {
            using (WebClient wcDownload = new WebClient())
            {
                try
                {
                    // Create a request to the file we are downloading
                    webRequest = (HttpWebRequest)WebRequest.Create("http://radio.rpgfm.ru:8000/live");
                    // Set default authentication for retrieving the file
                    webRequest.Credentials = CredentialCache.DefaultCredentials;
                    // Retrieve the response from the server
                    webResponse = (HttpWebResponse)webRequest.GetResponse();
                    // Ask the server for the file size and store it
                    Int64 fileSize = webResponse.ContentLength;
 
                    // Open the URL for download 
                    strResponse = wcDownload.OpenRead("http://radio.rpgfm.ru:8000/live");
                    // Create a new file stream where we will be saving the data (local drive)
                    strLocal = new FileStream(saveFileDialog1.FileName, FileMode.Create, FileAccess.Write, FileShare.None);
 
                    // It will store the current number of bytes we retrieved from the server
                    int bytesSize = 0;
                    // A buffer for storing and writing the data retrieved from the server
                    byte[] downBuffer = new byte[2048];
 
                    // Loop through the buffer until the buffer is empty
                    while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
                    {
                        // Write the data from the buffer to the local hard drive
                        strLocal.Write(downBuffer, 0, bytesSize);
                        // Invoke the method that updates the form's label and progress bar
                        //this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize });
                    }
                }
                
                finally
                {
                    // When the above code has ended, close the streams
                    strResponse.Close();
                    strLocal.Close();
                }
            }
        }
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
14.08.2011, 00:10
И получается играть станцию непрерывно?
0
 Аватар для tresh
6 / 6 / 0
Регистрация: 12.06.2011
Сообщений: 37
14.08.2011, 13:08  [ТС]
не понял о чем ты...
код тупо скачивает поток, а не воспроизводит его. Скачаный файл потом можно без проблем прослушать...
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
14.08.2011, 13:27
tresh, это все фигня, я вот как делал - сначала направлял поток или на компонент WMP или MediaElement и если попадалась интересный контент, то нажатием кнопки запускал код с WebRequest, похожий на твой.
Но в данном случае все это довольно тривиальная задача.
А вот захват поток из asf или по протоколу mms - это уже по интереснее будет задачка.
0
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 5
09.10.2011, 21:12
tresh, у меня возникла проблема. Я использовал твой код, приведенный выше. Файл создается, запись начинается, но при нажатии на button6 запись не останавливается. В процессах даже после закрытия моей программы висит my_prog_name.vshost.exe ( если закрыть без старта записи, то процесс сам завершается). В итоге, пока в диспетчере не "убить" этот процесс размер записываемого файла 0 байт. Возможно, ошибка где-то здесь
C#
1
2
3
4
5
6
7
8
9
10
private void button6_Click(object sender, EventArgs e)
        {
            webResponse.Close();
            strResponse.Close();
            strLocal.Close();
            // Abort the thread that's downloading
            thrDownload.Abort();
            button5.Enabled = true;
            button6.Enabled = false;
            textBox2.Clear();
Помогите решить проблему.
0
 Аватар для tresh
6 / 6 / 0
Регистрация: 12.06.2011
Сообщений: 37
09.10.2011, 22:34  [ТС]
my_prog_name.vshost.exe он будет висеть до тех пор, пока открыта студия.

чтобы все работало, найди такие строки :
C#
1
2
3
4
5
6
7
while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
                        {
                            // Write the data from the buffer to the local hard drive
                            strLocal.Write(downBuffer, 0, bytesSize);
                            // Invoke the method that updates the form's label and progress bar
                            //this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize });
                        }
и вставь их в трай:
C#
1
2
3
4
5
6
7
8
9
10
11
try
                    {
                        while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
                        {
                            // Write the data from the buffer to the local hard drive
                            strLocal.Write(downBuffer, 0, bytesSize);
                            // Invoke the method that updates the form's label and progress bar
                            //this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize });
                        }
                    }
catch { }
Спасибо на кнопку)
1
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 5
09.10.2011, 22:56
tresh, огромное спасибо. Была еще и ошибка у меня из-за невнимательности на кнопке "левый" код висел, поэтому запись и не завершалась.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2011, 22:56
Помогаю со студенческими работами здесь

Чтение данных из аудио потока (интернет-радио)
Добрый день, коллеги, я уже 2 месяца пытаюсь найти способ прочитать данные из потоков форматов mp3 и aac, но поиски безуспешны,...

После переустановки система установил драйверу звука, но опять звука нет...
пОСле переустановки система установил драйверу звука, но опять звука нет...

Магнитола Daewoo AKF8035RDS - нет звука на FM, блокируются кнопки добавления и уменьшения звука
Здравствуйте. Попалась мне магнитола Daewoo AKF8035RDS. Нет звука на FM диапазоне, при этом блокируются кнопки добавления и уменьшения...

Получить данные из аудио-потока (интернет-радио) - название песни, исполнитель
Всем привет, все никак найти не могу, каким образом выдернуть метаданные из потока, например, если открыть этот...

Запись радио
Можно ли записать интернет-радио, если да то чем ? пробовал пару прог, но они пишут - неизвестный тип потока


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru