Как мгновенно воспроизводить записываемое аудио без предварительного сохранения его в звуковой файл?
Хочу реализовать код, который будет мгновенно воспроизводить всё, что было записано при помощи любого устройства ввода звуковой информации, но без предварительного сохранения всех данных в mp3/wav и им подобные файлы (должно получиться что-то вроде проверки звука у микрофона). Подскажите пожалуйста: экземпляр какого класса хранит все данные и какой(ая) метод/функция позволяет достать из него данные? Искал эту информацию в документации и исходниках, но тщетно.
Ответы (1 шт):
Любой файл, будь то аудио, видео, текст или вообще что угодно - это в первую очередь байты, массив байт.
В .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 полно своих готовых классов читателей-писателей как в файлы, так и в оперативу, читайте документацию или полезные статьи по этой теме.