QAudioOutput всегда сталкивается с UnderrunError - PullRequest
4 голосов
/ 04 марта 2012

Я использую Qt 4.8 с Qt Creator 2.4.1 на Windows 7 Ultimate x64.

Я беру аудиовход, используя класс QAudioInput, и воспроизводю его, используя QAudioOutput. Имеется 2-секундный тайм-аут, после которого я прекращаю принимать данные, а затем настраиваю выход следующим образом:

class MainWindow
{
    // ...

    QByteArray output_data;
    QBuffer output_data_buffer;
    QAudioOutput *audio_out;

    // ...
};

MainWindow::MainWindow(QWidget *parent)
{
    // ...

    output_data_buffer.setBuffer(&output_data);

    // ...
}

void MainWindow::audioInputStopped(QByteArray data)
{
    output_data = data;
    output_data_buffer.open(QIODevice::ReadOnly);
    audio_out = new QAudioOutput(audio_format, this);
    connect(audio_out, SIGNAL(stateChanged(QAudio::State)), 
            SLOT(audioOutputStateChanged(QAudio::State)));
    audio_out->start(&output_data_buffer);
}

Используемый мной аудиоформат поддерживается как устройствами ввода, так и вывода. Я проверил их, используя QAudioDeviceInfo::isFormatSupported(). 2-секундный звук (data in audioInputStopped()) всегда воспроизводится нормально.

В слоте audioOutputStateChanged я всегда сталкиваюсь с ошибкой QAudio::UnderrunError от audio_out->error() после завершения воспроизведения буфера. После вызова audio_out->start() состояние (переданное как параметр в audioOutputStateChanged()) и ошибка выглядят следующим образом:

  1. Нет ошибок. Активное состояние.
  2. Нет ошибок. Остановленное состояние.
  3. Ошибка опустошения. Состояние бездействия.

Обратите внимание, что я останавливаю audio_out в состоянии ожидания , следуя этому примеру . Почему в коде обнаружена ошибка опустошения? Это нормально?

1 Ответ

1 голос
/ 27 июня 2012

Это может показаться странным, но я видел, где встроенные массивы в Qt лучше обрабатываются при построении в куче, или, по крайней мере, когда их элементы создаются в куче (так что они являются просто массивом указатели). Управление памятью немного сложнее, но помещенные в них элементы не выходят за рамки. Объектная модель Qt также позволяет помещать большинство вещей в кучу и правильно их воспитывать. Это может помочь.

После небольшого чтения о переполнениях буфера звучит, как будто что-то все еще пытается прочитать из аудиоисточника, в то время как что-то еще записывает в него или наоборот. Проверьте некоторые из ссылок ниже. Вы можете попробовать отключить часть audio_in от буфера перед чтением буфера. Это более вероятно, чтобы исправить ошибку.

Я бы также создал ваш указатель QAudioOutput в конструкторе для вашего главного окна (больше как стиль). Следуя тому, как это организовано в примерах в Qt, это выглядит как лучшая организация. Вот cpp для примера QAudioInput .

Если бы у вас был более полный пример, я мог бы попробовать больше с ним, чтобы воссоздать ошибку и отладить ее.

Вот кто-то еще, чтобы сочувствовать:

http://qt -project.org / форум / viewthread / 16729

И статья в вики:

http://en.wikipedia.org/wiki/Buffer_underrun

И список мультимедийных примеров на Qt:

http://doc.qt.nokia.com/4.7-snapshot/examples-multimedia.html

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...