Russian Qt Forum

Qt => Мультимедиа => Тема начата: vunder от Сентябрь 15, 2010, 11:20



Название: Проигрывание звукового потока в Phonon
Отправлено: vunder от Сентябрь 15, 2010, 11:20
Получаю звуковой поток через сеть, через свой xml-протокол. Необходимо воспроизвести его. Сначала делал через QAudioOutput? но приложение должно собираться под Qt 4.5, а там еще нет этого класса, поэтому переделываю на Phonon.

Код
C++ (Qt)
private
 Phonon::MediaObject *mediaObject;
 Phonon::AudioOutput *audioOutput;
 QBuffer bufDevice;
 

Код
C++ (Qt)
 audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
 bufDevice.open(QIODevice::ReadWrite);
 mediaObject = new Phonon::MediaObject(this);
 mediaObject->setCurrentSource(Phonon::MediaSource(&bufDevice));
 Phonon::createPath(mediaObject, audioOutput);
 mediaObject->play();
 

При получении звука:
Код
C++ (Qt)
 bufDevice.write(QByteArray::fromHex(domItem.attribute("sound").toAscii()));
 

Звука нет. В чем проблема?


Название: Re: Проигрывание звукового потока в Phonon
Отправлено: vunder от Сентябрь 17, 2010, 16:11
Немного разобрался. Оказывается для фонона нужно каждый блок снабжать заголовком, причем именно тем, какого формата данные (в моем случае это wav-header).

Следующий затык был в потоковом воспроизведении. Сделал, как рекомендуется воспроизводить в Windows:
 - создаю массив буферов
 - по мере поступления данные записываются в очередной элемент массива
 - после записи блока данных он помещается в очередь на воспроизведение Phonon::MediaObject::enqueue.

Однако после воспроизведения первого блока звук прекращался. Попробовал вызывать Phonon::MediaObject::play после накопления некоторого числа буферов в очереди - сработало, однако звук прерывистый получается


Название: Re: Проигрывание звукового потока в Phonon
Отправлено: vunder от Октябрь 03, 2010, 17:49
Частично решил проблему. Алгоритм такой:
- после запуска накапливаю 2 секунды звука, после чего добавляю его в очередь воспроизведения методом MediaObject::enqueue() и запускаю воспроизведение
- пока проигрывается звук продолжаю накапливать данные, но в новый буфер
- при получении сигнала aboutToFinish() от MediaObject добавляю буфер в очередь воспроизведения, а накапливать продолжаю в очередной буфер.
На деле получается не очень сдорово. Звук иногда прерывается, иногда некоторые звуковые блоки повторно воспроизводятся. Это возможно из-за неправильного использования буфера.
Проблемы с воспроизведением можно решить, если воспроизводить не столько данных, сколько успели накопить, а фиксированные. Опыты показали, что при длине буфера более 2 секунды звук не прерывается.
Если проблему решу, обязательно поделюсь результатами