Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
171 / 27 / 16
Регистрация: 02.02.2014
Сообщений: 345
1

NAudio воспроизведение в реальном времени

01.02.2017, 15:23. Показов 1036. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем! Возникла необходимость воспроизводить PCM-поток реального времени. То есть в одном потоке поступают семплы, в другом проигрываются. Решил использовать NAudio. Не нашел IWaveProvider, который бы обеспечивал такое поведение, сделал для эксперимента свой:
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
  class QueueWaveProvider : IWaveProvider
        {
            public QueueWaveProvider(WaveFormat format)
            {
                WaveFormat = format;
            }
            public WaveFormat WaveFormat { get; }
            public void PushBytes(params byte[] bytes)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    byts.Enqueue(bytes[i]);
                }
            }
 
            readonly ConcurrentQueue<byte> byts = new ConcurrentQueue<byte>();
            public int Read(byte[] buffer, int offset, int count)
            {
                try
                {
                    for (int i = 0; i < count; i++)
                    {
                        byte o;
                        while (!byts.TryDequeue(out o))
                            ;
                        buffer[i] = o;
                    }
                    return count;
                }
                catch (Exception er)
                {
                    return count;
                }
            }
        }
Над синхронизацией потоков пока не заморачивался, просто while. Так вот, один поток пихает через PushBytes семплы в виде байт, и плеер по идее должен их читать и проигрывать. Однако, воспроизведение быстро останавливается.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 using (var waveout = new WaveOut())
            {
                            var provider = new QueueWaveProvider(new WaveFormat());
 
                            waveout.Init(provider);
 
                            provider.PushBytes(ReadNextBytes());
 
                            waveout.Play();
 
                            while (working)
                            {
                                   var bytes = ReadNextBytes();
                                   provider.PushBytes(ReadNextBytes());
                            }
 
            }
Функция ReadNextBytes сама ждет некоторое время, т.к. получает байты с потока. Байты гарантированно успевают за воспроизведением. В результате проигрываются первые два семпла, после чего Read у QueueWaveProvider перестает вызываться, воспроизведение встает.

Соответственно, вопрос, как организовать правильно воспроизведение потока семплов? Если учесть, что этот поток бесконечный, и полностью его не прочитать, а буферизация должна быть минимальной?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2017, 15:23
Ответы с готовыми решениями:

[NAudio] Зациклить воспроизведение трека
В общем решил сделать кое какую программу не важно какую с использованием библиотеки NAudio все...

Воспроизведение Wave файла с помощью NAudio
Доброго время суток. Помогите пожалуйста. Файл прикреплён. Не могу понять как исправить данную...

Воспроизведение звука с микрофона вебкамеры в реальном времени
Хочу сделать так, чтобы например сказал что-то в микрофон вебкамеры и оно тут же воспроизвелось в...

Panasonic VDR-D 150, воспроизведение на компьютре в реальном времени
Предлагается видеокамера &quot;Panasonic VDR-D 150&quot;, сама для DVD и SD, хозяин толком ничего сказать не...

0
01.02.2017, 15:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2017, 15:23
Помогаю со студенческими работами здесь

Воспроизведение wave из потока средствами NAudio.dll
Нужно написать простенький голосовой чат. Запись звука осуществил с помощью NAudio.dll, ну а...

Подсчет времени в реальном времени
Добрый день, подскажи пожалуйста как нужно сделать что бы подсчитать количество часов. В первом...

Форма в реальном времени
Реализую политику безопасности в программе, и не знаю как сделать чтобы компоненты на форме...

Синхронизация в реальном времени
Доброго дня! Есть такая тема. Два сервера (апач + mysql), диры с веб содержимым синхронизируются...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru