crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Проблемы с воспроизведением звука, QAudioOutpur
mezmay
  опции профиля:
сообщение 15.12.2012, 12:52
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Как известно, в Qt для воспроизведения звука предназначен класс QAudioOutput. Стартовать воспроизведение можно двумя способами:
QIODevice *start()
и
void start(QIODevice *)
.
Первый возвращает QIODevice, в который можно писать данные с момощью write, а второй стартует воспроизведение, считывая звук из переданного в него QIoDevice.
Ситуация:
По сокетам приходят звуковые буфера. Все вместе взятые она содержат непрерывный звук, ~по 0.5 секунды в каждом буфере. Но приходят они не точно раз в пол секунды, а неравномерно. Когда пользовались первым способом, звук сильно разрывался, откуда можно сделать вывод, что такой способ некорректно добавляет данные к воспроизводимым.
Для того чтобы пользоваться вторым способом, должен быть все время заполненный QIODevice. Вот как сделал я:

QBuffer  m_audioBuffer;
QAudioOutput *m_pAudioOutput;
qint64 buf_num = 0;
...

void MyClass::onReceiveSoundBuffer()
{
    // Если накоплено 3 буфера и не идет воспроизведение - воспроизвести
              // (фактически это простая реализация предварительного накопления)
    if(buf_num > 2 && m_pAudioOutput->state() != QAudio::ActiveState)
        m_pAudioOutput->start(&m_audioBuffer);

    // Инкрементация счетчика итераций
    buf_num++;

    // Считываем звуковой буфер из сокета
    QByteArray audio_data;
    out >> audio_data;

    // А вот такимим финтами добавляем звук
    qint64 actPos = m_audioBuffer.pos();
    m_audioBuffer.seek(m_audioBuffer.size());
    m_audioBuffer.write(audio_data);
    m_audioBuffer.seek(actPos);
}

Но судя по всему в этом случае будет наступать переполнение буфера. Вопросы:
1. Как избежать переполнения буфера
2. Как вообще нормальным способом непрерывно воспроизводить звук на Qt? (то есть сделать чтобы приходящий новый буфер либо шел сразу на воспроизведение, либо аппендился к уже воспроизводящемуся)

Сообщение отредактировал mezmay - 15.12.2012, 13:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.11.2024, 7:05