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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проигрывание звукового потока в Phonon  (Прочитано 4787 раз)
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()));
 

Звука нет. В чем проблема?
« Последнее редактирование: Сентябрь 15, 2010, 11:23 от vunder » Записан
vunder
Гость
« Ответ #1 : Сентябрь 17, 2010, 16:11 »

Немного разобрался. Оказывается для фонона нужно каждый блок снабжать заголовком, причем именно тем, какого формата данные (в моем случае это wav-header).

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

Однако после воспроизведения первого блока звук прекращался. Попробовал вызывать Phonon::MediaObject::play после накопления некоторого числа буферов в очереди - сработало, однако звук прерывистый получается
Записан
vunder
Гость
« Ответ #2 : Октябрь 03, 2010, 17:49 »

Частично решил проблему. Алгоритм такой:
- после запуска накапливаю 2 секунды звука, после чего добавляю его в очередь воспроизведения методом MediaObject::enqueue() и запускаю воспроизведение
- пока проигрывается звук продолжаю накапливать данные, но в новый буфер
- при получении сигнала aboutToFinish() от MediaObject добавляю буфер в очередь воспроизведения, а накапливать продолжаю в очередной буфер.
На деле получается не очень сдорово. Звук иногда прерывается, иногда некоторые звуковые блоки повторно воспроизводятся. Это возможно из-за неправильного использования буфера.
Проблемы с воспроизведением можно решить, если воспроизводить не столько данных, сколько успели накопить, а фиксированные. Опыты показали, что при длине буфера более 2 секунды звук не прерывается.
Если проблему решу, обязательно поделюсь результатами
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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