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

NAudio - Mp3FileReader - искаженный вывод аудио

28.02.2019, 21:50. Показов 5321. Ответов 23

Студворк — интернет-сервис помощи студентам
Здравия!

Я преобразую входящий поток 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());
        }
    }
Из другого источника приходит сигнал (записанный на WaveIn или полученный подобным образом). Этот звуковой сигнал в виде массива байт окунается в функцию.
C#
1
2
3
4
5
6
7
8
9
10
11
static Mp3FileReader r;
 
    public static void Broadcast(byte[] data)
    {
        r = new Mp3FileReader(WavToMP3(data));
 
        while ((frame = r.ReadNextFrame()) != null)
        {
            foreach(Consumer c in WebCast.Clients) c.Send(frame.RawData);
        }
    }
Данный код переводит байты wav в mp3. Все бы ничего, но каждые эти 6 кадров на выходе через HTTP у клиента звук как-будто замедленный прерывистый. Ранее этим же Mp3FileReader-ом я сохранял данные на диск, там каких-либо искажений (проигран через WMP ui) замечено не было. Вестимо, искажение в байтах числится в frame.RawData. Я не зря оставил команды вывода в консоль данных кадров, вот такая у нас раскадровка по блокам(по 6), каждая строка - один кадр.
Перерыв весь интернет, нашел только это, но, говоря честно, я не понял до конца где и что надо убрать в моем коде, дабы искажения не было: https://stackoverflow.com/ques... ith-naudio

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

В двух словах: кадры с mp3 воспроизводятся через браузер MPEG-ом искаженно(замедленно, прерывисто, с отставанием). Согласно изученным результатам, полагаю, что кроме чистых данных, в кадрах есть еще какой-то мусор, который и дает эти искажения в плеере.
Буду благодарен за любую помощь или направление. Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.02.2019, 21:50
Ответы с готовыми решениями:

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

Mp3FileReader - медленный вывод аудио (NAudio.dll)
P.S. Т.к. я думаю что это из за особенности строения mp3 файла, публикую в эту тему Доброго времени суток! Я преобразую входящий...

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

23
 Аватар для slenderface
9 / 9 / 5
Регистрация: 24.03.2014
Сообщений: 313
03.03.2019, 11:34  [ТС]
Студворк — интернет-сервис помощи студентам
nicolas2008, честно говоря воспроизвести уже будет проблематично, но я там много вариантов с записью перепробовал, пробовал даже костыль: запись в файл - чтение из файла - отправка. Все дало одну и ту же ошибку о том, что запись в поток невозможна, либо он просто зависал.
Я нашел временное решение глобального кэша, которое сократила заедание вместо нескольких десятков фризов в секунду до 1 фриза в 6 секунд и это хотя бы можно уже слушать:
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
static Mp3Frame frame;
        
        static List<byte> Buffer = new List<byte>();
        
        public static void Broadcast(byte[] data)
        {
            PlayBack.Play(data, PlayBack.DataType.Wav);
            
            Buffer.AddRange(data);
            
            if(Buffer.Count > 200000)
            {
                Log.Out("Buffered part of data...");
                
                Mp3FileReader r = new Mp3FileReader(WavToMP3(Buffer.ToArray()));
                
                while ((frame = r.ReadNextFrame()) != null)
                {
                    foreach(Consumer c in WebCast.Clients) c.Send(frame.RawData);
                }
                
                Buffer.Clear();
            }
        }
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
03.03.2019, 15:00
slenderface, похоже вы прави.
Из того что я вижу, сама libmp3lame.dll, на которой основана NAudio.Lame, не поддерживает потоковое кодирование.
Для получения результата нужно вызвать flush, а он финализирует кодирование.
0
 Аватар для slenderface
9 / 9 / 5
Регистрация: 24.03.2014
Сообщений: 313
03.03.2019, 22:32  [ТС]
nicolas2008, ну вот в целом я где-то близок к разгадке. я вот сейчас попытаюсь обрезать последние 128 байт, в них может быть ID3v1, который и дает сбой
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
05.03.2019, 13:18
slenderface, напишите если получится, тоже интересно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.03.2019, 13:18

Искаженный график (EPS)
В моем компе на работе недавно установили Матлаб. Почему-то есть какой-то баг с графиками. fig, jpg график выглядит как на экране, а в EPS...

искаженный звук из колонок
Привет, у меня такая проблемма у меня колонки с саббуфером sven|SPS-820. Недавно купил вебкамеру с микрофоном, и теперь если я делаю...

Определить не искаженный текст на скриншоте
При нажатии на кнопку нужно определить простой текст на этой картинке (Libraries и ниже, но нужно именно распознать):

Очень тихий и искаженный звук
В чем может быть проблема ? Звук в колонках и наушниках одинаково плохой. Установка новых драйверов не помогла.

Наушники, искаженный звук, ноутбук, windows 7
Здравствуйте, суть проблемы такова: когда подключаешь рабочие наушники к ноутбуку (на стационарном все работает замечательно) и...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru