Russian Qt Forum

Qt => Мультимедиа => Тема начата: fantom от Январь 01, 2012, 14:00



Название: QAudioOut Stream
Отправлено: fantom от Январь 01, 2012, 14:00
Здравствуйте, мне нужно воспроизвести аудио данные, которые поступают кусками из сети.
Сейчас пытаюсь просто воспроизвести большой буффер без организации потоковости. Делаю так:
Код:
    QBuffer buffer;
    buffer.open(QIODevice::ReadWrite);
    QAudioOutput* out_audio;
    QAudioFormat format;
        format.setFrequency(8000);
        format.setChannels(1);
        format.setSampleSize(8);
        format.setCodec("audio/pcm");
        format.setByteOrder(QAudioFormat::LittleEndian);
        format.setSampleType(QAudioFormat::UnSignedInt);
    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
    if (!info.isFormatSupported(format)) {
        //qWarning()<<".";
        QMessageBox::critical(0,"Error","raw audio format not supported by backend, cannot play audio",QMessageBox::Ok);
        return;
        }
    out_audio = new QAudioOutput(format, this);
    QByteArray byteArray;
    for(int i = 0;i<30000;i++)
        byteArray[i] = (char)100*sin((float)6.28*i*1000.0/48000.0);
    buffer.write(byteArray);
    buffer.close();
    out_audio->start(&buffer);
Проект компилит без ошибок, но при запуске виндовс выводит об ошибке и закрывает программу.
Подпись ошибки:AppName: audio_test.exe    AppVer: 0.0.0.0    ModName: msvcrt.dll
ModVer: 7.0.2600.5512    Offset: 00036fa3
Может я что то в коде намудрил? Кто имеет опыт работы с аудио в Qt может знает в чем причина?


Название: Re: QAudioOut Stream
Отправлено: popper от Январь 01, 2012, 19:53
Буфер не нужно закрывать перед методом start(), а также советую создавать буфер динамически.


Название: Re: QAudioOut Stream
Отправлено: fantom от Январь 02, 2012, 00:03
Спасибо за подсказку. С одним буфером разобрался. Теперь нужно организовать потоковое воспроизведение.
Т.е. у нас есть два буфера, пока один играет, ждем новые данные. При поступлении записываем в соседний.
Потом играет тот, в который записывали, а с проигравшым поступаем аналогично.
Пока я вообще не представляю как это сделать. Может кто делал подобное? Как организовать извещение, что буфер полностью воспроизведен?

Или как зациклить воспроизведение? Что бы когда буфер проигрался, воспроизведение автоматически началось с начала буфера.


Название: Re: QAudioOut Stream
Отправлено: popper от Январь 02, 2012, 11:21
Читай внимательно справку по QAudioOutput.
Там в том числе указано, что после воспроизведения данных генерируется сигнал QAudioOutput::stateChanged с параметром QAudio::IdleState.
Для воспроизведения данных с начала попробуй вызвать QIODevice::seek(0) в слоте, подключенном к QAudioOutput::stateChanged.