Форум программистов, компьютерный форум, киберфорум
Программирование звука
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для slenderface
9 / 9 / 5
Регистрация: 24.03.2014
Сообщений: 313

Mp3FileReader - медленный вывод аудио (NAudio.dll)

28.02.2019, 21:37. Показов 2858. Ответов 6

Студворк — интернет-сервис помощи студентам
P.S. Т.к. я думаю что это из за особенности строения mp3 файла, публикую в эту тему

Доброго времени суток!
Я преобразую входящий поток wav в mp3 через Lame этой функцией:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public static MemoryStream WavToMP3(byte[] wavFile)
    {
        using(var retMs = new MemoryStream())
        using(var ms = new MemoryStream(wavFile))
        using(var rdr = new RawSourceWaveStream(ms, new WaveFormat(22050, 1)))
        using(var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, LAMEPreset.ABR_128))
        {
            rdr.CopyTo(wtr);
            wtr.Flush();
            return new MemoryStream(retMs.ToArray());
        }
    }
Из другого источника приходит сигнал wav формата (записанный на WaveIn или полученный подобным образом). Этот звуковой сигнал в виде массива байт окунается в функцию.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static Mp3FileReader r;
 
    public static void Broadcast(byte[] data)
    {
        r = new Mp3FileReader(WavToMP3(data));
        Console.Title = r.XingHeader.Frames.ToString();
 
        Console.WriteLine("Frames Count = " + r.XingHeader.Frames.ToString());
 
        int framePos = 0;
 
        while ((frame = r.ReadNextFrame()) != null)
        {
            framePos++;
 
            Console.WriteLine("[ SR={0} BIT={1} Lenght={2}  ] ", frame.SampleRate, frame.BitRate, frame.FrameLength );
 
            foreach(Consumer c in WebCast.Clients) c.Send(frame.RawData);
        }
 
        Console.WriteLine("=======================================");
    }
Данный код переводит байты wav в mp3. Все бы ничего, но каждые эти 6 кадров на выходе через HTTP у клиента звук как-будто замедленный прерывистый. Ранее этим же Mp3FileReader-ом я сохранял данные на диск, там каких-либо искажений (проигран через WMP ui) замечено не было. Вестимо, искажение в байтах числится в frame.RawData. Я не зря оставил команды вывода в консоль данных кадров, вот такая у нас раскадровка по блокам(по 6), каждая строка - один кадр: pastebin

Перерыв весь интернет, нашел только это, но, говоря честно, я не понял до конца где и что надо убрать в моем коде, дабы искажения не было: https://stackoverflow.com/ques... ith-naudio

И тут у человека что-то подобное было, но это не то: https://coderpapers.com/question/2203124/

В двух словах: кадры с mp3 воспроизводятся через браузер MPEG-ом искаженно(замедленно, прерывисто, с отставанием). Согласно изученным результатам, полагаю, что кроме чистых данных, в кадрах есть еще какой-то мусор, который и дает эти искажения в плеере.

Буду благодарен за любую помощь или направление. Спасибо!

Добавлено через 1 минуту
Pastebin раскадровки
https://pastebin.com/r7ZvQ1hu
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.02.2019, 21:37
Ответы с готовыми решениями:

NAudio - Mp3FileReader - искаженный вывод аудио
Здравия! Я преобразую входящий поток wav в mp3 через Lame этой функцией: public static MemoryStream WavToMP3(byte wavFile) ...

NAudio. Реализовать смену высоты звука(тона) аудио
Доброго времени суток! Пишу синтезатор звуков. При нажатии на кнопку вызываю воспр. звука так: SoundPlayer sp = new...

Покажите примеры по использованию NAudio.dll
Покажите пожалуйста примеры по использованию и проигрывания песен с использованием такой мощной библиотеки как NAudio.dll - я ни как не...

6
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6784 / 2027 / 235
Регистрация: 14.12.2014
Сообщений: 4,257
Записей в блоге: 12
01.03.2019, 00:16
Приветствую!
А если вы будете записывать это в файл (или выводить как аудио... но лучше в файл, а потом открыть в редакторе), а не передавать по сети, у вас тоже будет прерывистый звук?
Т.е. это не может быть связано как-то с передачей по сети?
0
 Аватар для slenderface
9 / 9 / 5
Регистрация: 24.03.2014
Сообщений: 313
01.03.2019, 13:59  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Т.е. это не может быть связано как-то с передачей по сети?
при записи в файл все записывается как надо, я проверял.

Добавлено через 2 часа 8 минут
Jin X, у меня там получается передача потока звука блочная. один блок содержит по 6 кадров.
предлагаю изучить вам это, меня там удивляет тот факт, что некоторые кадры "выбиваются" из общего стада, у них другая дискретизация и битрейт. если я их удаляю - звук становится кашей из шумов. удаление хотя бы одного кадра приводит к еще более худшей картине. причем в разных блоках разная линия кадров, которая через n-ый цикл вроде как повторяется

https://pastebin.com/r7ZvQ1hu
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6784 / 2027 / 235
Регистрация: 14.12.2014
Сообщений: 4,257
Записей в блоге: 12
01.03.2019, 15:06
Цитата Сообщение от slenderface Посмотреть сообщение
при записи в файл все записывается как надо, я проверял.
Ну, так, причём тут звук вообще тогда? Это какая-то сетевая проблема.

А у вас вообще получаемый звук кэшируется? Или новый блок читается после воспроизведения старого? И даже если буфер есть, но небольшой, он может не успевать заполниться новыми данными. Поэтому звук и прерывается.

Цитата Сообщение от slenderface Посмотреть сообщение
предлагаю изучить вам это
И что тут изучать?
0
 Аватар для slenderface
9 / 9 / 5
Регистрация: 24.03.2014
Сообщений: 313
01.03.2019, 15:31  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
А у вас вообще получаемый звук кэшируется? Или новый блок читается после воспроизведения старого?
смотрите: скажу честно, я в устройстве аудио и его передачи не очень силен, делаю так же, как, например, с обычными текстовыми сообщениями.

Алгоритм такой:
есть три девайса(сейчас все на одном тестится): клиент-запись(далее З), сервер(С), клиент-получатель(П)

- На З записывается wav звук с аудиокарты (микрофон, вн.рестрасляция из колонок(WaveIn) и т.п.
- Далее он идет по классическому TCP на в виде массива байт к С. С конвертирует из wav byte[] в mp3 кадры, из которых уже получаются mp3 байты
- С в другом потоке ждет подключение в любом промежутке времени (если клиенты не подключены, данные просто умирают, взятые от З). Приходит подключение от К(браузера) и для него создается персональный поток. Далее С отправляет заголовок и бесконечным потоком, пока есть это подключение, перенаправляет Mp3 байты кадра сразу в поток на Write для К. Если К несколько, он делает отправку данных методом перебора. В браузере К я заметил, кстати, что аудио-контрольный ползунок все время как бы задыхается, он на приделе в конце, на подобных потоках он где-то ближе к своей середине. Полагаю, что может реально нужен кэш?
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6784 / 2027 / 235
Регистрация: 14.12.2014
Сообщений: 4,257
Записей в блоге: 12
01.03.2019, 16:32
Не всё понял из описания.
Но учитывайте следующее:
• Фреймы mp3 должны передаваться целыми блоками и вместе с заголовком фрейма, т.к. у вас VBR, соответственно, битрейт разный и при воспроизведении на постоянном битрейте могут быть глюки. Это так, на всякий случай.
• Нужен буфер для получения данных, т.е. не начинать воспроизведение, пока клиент не получил, скажем, 10 блоков, а когда проигрывается последний блок, воспроизведение останавливается и снова ожидается заполнение буфера в 10 блоков (ну или сколько-то ещё... я не знаю, какой размер блока у вас в секундах, насколько большое отставание по времени от записи допустимо и насколько быстрое соединение... можно 5 секунд сделать, к примеру, или 1-2 секунды, если важна более или менее синхронность (и соединение быстрое), или 10 секунд, если важнее стабильность – короче, можно тут тестить, при каком буфере зву не прерывается + взять запас раза в 2-3). Посмотрите, как работает YouTube, к примеру, при плохом соединении: сначала идёт буферизация видеопотока, а только потом начинается воспроизведение.
1
 Аватар для slenderface
9 / 9 / 5
Регистрация: 24.03.2014
Сообщений: 313
01.03.2019, 18:45  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Нужен буфер для получения данных, т.е. не начинать воспроизведение, пока клиент не получил, скажем, 10 блоков, а когда проигрывается последний блок, воспроизведение останавливается и снова ожидается заполнение буфера в 10 блоков (ну или сколько-то ещё... я не знаю, какой размер блока у вас в секундах, насколько большое отставание по времени от записи допустимо и насколько быстрое соединение... можно 5 секунд сделать, к примеру, или 1-2 секунды, если важна более или менее синхронность (и соединение быстрое), или 10 секунд, если важнее стабильность – короче, можно тут тестить, при каком буфере зву не прерывается + взять запас раза в 2-3). Посмотрите, как работает YouTube, к примеру, при плохом соединении: сначала идёт буферизация видеопотока, а только потом начинается воспроизведение.
Огромное спасибо за столь подробный ответ. Сейчас попробую снова, но предыдущая попытка показывает, что когда я замораживаю вывод блоков на пару секунд - прерывается соединение. (Thread.Sleep, каждый клиент в отдельном потоке)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.03.2019, 18:45
Помогаю со студенческими работами здесь

NAudio.dll не работает в Wi7 и Win8.1 64 bit
Добрый день Всем! В VB2005 на XP 32 bit писал программку по обработке звуковых данных с использованием буфера NAudio.dll, решил...

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

Запись и вывод звука с NAudio
Здравствуйте. Только начал работать со звуком и в частности с NAudio. Подскажите, пожалуйста, каким образом производится запись звука и его...

Медленный ввод в текстовые поля / медленный отклик в google chrome?
Привет! Может кто знает, Сегодня заметил, что ввод текста в браузере chrome стал очень медленным и отклик тоже. Например, при наборе...

STM32F103 + TFT 240x320 + SD = медленный вывод картинок
Есть МК STM32F103VCT6, к нему при помощи FSMC подключен TFT дисплей 240х320 и SD карта по SPI. На этот самый дисплей выводятся картинки....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »