Запись/конвертирование АУДИО-данных в WAV в режиме реального времениC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Запись/конвертирование АУДИО-данных в WAV в режиме реального времени

Сообщение Anonymous »

Я новичок в обработке аудиосигнала.

В настоящее время я подключил к компьютеру устройство, которое отправляет мне аудиоданные с микрофона/дорожки воспроизведения. Я уже создал хост-приложение с использованием Steinberg ASIO SDK 2.3, которое подключается к устройству и при повторяющемся обратном вызове возвращает необработанные данные. Сигнал 24-битный, а частоту можно выбрать любую, скажем, 44100 Гц, 2 панорамы, один канал. Я также преобразовал этот сигнал в двойной , поскольку я выполняю над ним некоторую обработку сигнала.

Теперь я хотел бы добавить на свой хост функцию записи. Например, при нажатии кнопки входящие данные постоянно преобразуются в файл WAV, а когда я нажимаю другую кнопку, они останавливаются и сохраняются.

Я уже читал о файлах WAV, форматах файлов, форматах битового потока (RIFF) и каким-то образом имею общее представление о том, как выглядит файл WAV. Я также проверил множество тем форума, тем stackoverflow или сообщений о проектах кода, и везде я нахожу что-то связанное с темой, но не могу понять, как я могу осуществлять постоянную запись в реальном времени. Много кода, который я нашел, посвящено преобразованию массива данных в WAV после внесения в него изменений. Я хотел бы осуществлять постоянное преобразование и добавлять/расширять WAV-файлы до тех пор, пока я не прикажу ему остановиться.

Например, могу ли я как-то это изменить?

Код: Выделить всё

#include 

template 
void write(std::ofstream& stream, const T& t) {
stream.write((const char*)&t, sizeof(T));
}

template 
void writeFormat(std::ofstream& stream) {
write(stream, 1);
}

template 
void writeFormat(std::ofstream& stream) {
write(stream, 3);
}

template 
void writeWAVData(
char const* outFile,
SampleType* buf,
size_t bufSize,
int sampleRate,
short channels)
{
std::ofstream stream(outFile, std::ios::binary);
stream.write("RIFF", 4);
write(stream, 36 + bufSize);
stream.write("WAVE", 4);
stream.write("fmt ", 4);
write(stream, 16);
writeFormat(stream);                                // Format
write(stream, channels);                                 // Channels
write(stream, sampleRate);                                 // Sample Rate
write(stream, sampleRate * channels * sizeof(SampleType)); // Byterate
write(stream, channels * sizeof(SampleType));            // Frame size
write(stream, 8 * sizeof(SampleType));                   // Bits per sample
stream.write("data", 4);
stream.write((const char*)&bufSize, 4);
stream.write((const char*)buf, bufSize);
}
И как-то в обратном вызове:

Код: Выделить всё

writeWAVData("mySound.wav", mySampleBuffer, mySampleBufferSize, 44100, 1);
Я благодарен за любую подсказку/ссылку/предложение/форму помощи.

Подробнее здесь: https://stackoverflow.com/questions/282 ... -real-time
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»