Russian Qt Forum
Сентябрь 21, 2024, 22:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAudioOut Stream  (Прочитано 4209 раз)
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 может знает в чем причина?
Записан
popper
Гость
« Ответ #1 : Январь 01, 2012, 19:53 »

Буфер не нужно закрывать перед методом start(), а также советую создавать буфер динамически.
Записан
fantom
Гость
« Ответ #2 : Январь 02, 2012, 00:03 »

Спасибо за подсказку. С одним буфером разобрался. Теперь нужно организовать потоковое воспроизведение.
Т.е. у нас есть два буфера, пока один играет, ждем новые данные. При поступлении записываем в соседний.
Потом играет тот, в который записывали, а с проигравшым поступаем аналогично.
Пока я вообще не представляю как это сделать. Может кто делал подобное? Как организовать извещение, что буфер полностью воспроизведен?

Или как зациклить воспроизведение? Что бы когда буфер проигрался, воспроизведение автоматически началось с начала буфера.
« Последнее редактирование: Январь 02, 2012, 00:13 от fantom » Записан
popper
Гость
« Ответ #3 : Январь 02, 2012, 11:21 »

Читай внимательно справку по QAudioOutput.
Там в том числе указано, что после воспроизведения данных генерируется сигнал QAudioOutput::stateChanged с параметром QAudio::IdleState.
Для воспроизведения данных с начала попробуй вызвать QIODevice::seek(0) в слоте, подключенном к QAudioOutput::stateChanged.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 20.