контроль количества байтов, готовых к чтению с аудиокарты в QT

В QT я могу определить аудиовход как:

m_audioInput = new QAudioInput(m_Inputdevice, m_format, this);
m_input = m_audioInput->start();

В моем приложении я хотел бы использовать микрофон и читать с аудиокарты.

Теперь, если я хочу увидеть, сколько байтов готово для чтения из аудиобуфера, я использую:

qint64 len = m_audioInput->bytesReady();

Похоже, что len является функцией частоты дискретизации и количества битов на выборку. Мой вопрос в том, есть ли способ управлять len без изменения частоты дискретизации? Другими словами, я хотел бы управлять звуковой картой так, чтобы она считывала данные более короткими блоками и выдавала сигнал готовности.


person TJ1    schedule 30.08.2012    source источник


Ответы (1)


Вы можете управлять звуковой картой, настроив соответствующие параметры формата, например, частоту, размер выборки. Для этого вам нужно использовать класс QAudioFormat.

Кроме этого, нет другого способа управлять звуковой картой из Qt.

Справочник по классам.

Пример из справочника:

QFile outputFile;   // class member.
QAudioInput* audio; // class member.

outputFile.setFileName("/tmp/test.raw");
outputFile.open( QIODevice::WriteOnly | QIODevice::Truncate );

QAudioFormat format;

// set up the format you want, eg.
format.setFrequency(8000);
format.setChannels(1);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);

QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format)) {
    qWarning()<<"default format not supported try to use nearest";
    format = info.nearestFormat(format);
}

audio = new QAudioInput(format, this);
QTimer::singleShot(3000, this, SLOT(stopRecording()));
audio->start(&outputFile);
// Records audio for 3000ms
person MD Sayem Ahmed    schedule 30.08.2012
comment
Спасибо за ответ. Знаете ли вы, если bytesReady() выдает сигнал готовности после того, как, скажем, будут готовы каждые 640 байт, но я прочитаю только 320 байт после того, как увижу выданный сигнал, тогда, если я прочитаю еще 320 байт, это будет продолжение данных, т.е. сначала read, читает с позиции 0 до 319, а второе чтение читает с позиции 320 до 639? - person TJ1; 30.08.2012
comment
@TJ1: Да, вы будете читать данные дальше. Например, после прочтения первых 320 байт, если вы снова прочитаете 320 байт из буфера, это будут следующие 320 байт по порядку. Но в этом случае вы скоро столкнетесь с переполнением аудиобуфера. Лучше сразу прочитать все данные из аудиобуфера, а затем сохранить их в каком-нибудь своем промежуточном буфере. Оттуда вы можете прочитать столько данных, сколько захотите, за один раз, не вызывая переполнения аудиобуфера. Вам все еще нужно сделать ваш промежуточный буфер настолько большим, насколько это необходимо, чтобы вы не столкнулись с переполнением здесь. - person MD Sayem Ahmed; 30.08.2012
comment
Есть ли другой способ контролировать размер байтов, готовых для чтения из любой другой библиотеки C++, а не только из QT? - person TJ1; 30.08.2012
comment
@ TJ1: Вы не можете контролировать, как работает ваше звуковое оборудование (ну, не напрямую, особенно, конечно, не из вашего приложения). Вы можете использовать форматы, которые поддерживает ваш звуковой драйвер. Если ваш аудиодрайвер поддерживает такой формат, что всякий раз, когда запускается сигнал готовности, он предоставляет вам 320 байт аудиоданных, тогда вы можете это сделать. Если это не так, то вы не можете. Вот почему люди используют промежуточный буфер при записи/воспроизведении звука. - person MD Sayem Ahmed; 30.08.2012