Как мгновенно воспроизводить записываемое аудио без предварительного сохранения его в звуковой файл?

Хочу реализовать код, который будет мгновенно воспроизводить всё, что было записано при помощи любого устройства ввода звуковой информации, но без предварительного сохранения всех данных в mp3/wav и им подобные файлы (должно получиться что-то вроде проверки звука у микрофона). Подскажите пожалуйста: экземпляр какого класса хранит все данные и какой(ая) метод/функция позволяет достать из него данные? Искал эту информацию в документации и исходниках, но тщетно.


Ответы (1 шт):

Автор решения: aepot

Любой файл, будь то аудио, видео, текст или вообще что угодно - это в первую очередь байты, массив байт.

В .NET массив байт представлен типом byte[]. Его можно читать из файла, писать в файл, вообще что угодно с ним делать.

Например можно совершенно любой файл целиком прочитать в массив.

byte[] bytes = File.ReadAllBytes("file.mp3");

Для записи в память вместо файла можно открыть поток данных, который впоследствии создаст массив байт.

using MemoryStream ms = new();

Работать с таким потоком данных можно аналогично как с потоком, читающим или пишущим в файл. Только здесь вместо файла, будет массив байт.

И далее в него писать данные любыми порциями точно также как в FileStream.

byte[] newBytes = ...; // какой-то небольшой массив-буфер
// ...
ms.Write(newBytes);

Далее из этого потока данных можно получить массив байт

byte[] bytes = ms.ToArray(); // копирование всех данных в массив

Записать MemoryStream в файл можно легко

ms.Position = 0;
using FileStream fs = File.Create("file.mp3");
ms.CopyTo(fs);

Массив байт тоже можно записать в файл

File.WriteAllBytes("file.mp3", bytes);

И так далее, изучайте .NET.

Ответ на ваш вопрос - byte[].


Массив байт может быть огромным - до 2 гигабайт или даже насколько памяти хватит (для x64 приложений). Но учтите, что это расходует оперативку компа. Несжатый например в mp3 аудиопоток может весить очень много.

Ещё стоит помнить одно свойство массива: размер массива байт задаётся при его создании и не может быть изменён. Нельзя просто так взять и увеличить размер массива или уменьшить. Даже если использовать встроенную функцию Array.Resize, технически она просто копирует данные старого массива в массив с новым размером. Поэтому если знаете, какими порциями данные поступают и как нужно их обрабатывать, создавайте массивы заранее пригодные для вмещения того что нужно.

У библиотеки NAudio полно своих готовых классов читателей-писателей как в файлы, так и в оперативу, читайте документацию или полезные статьи по этой теме.

→ Ссылка