Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с воспроизведением звука
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Мультимедиа
mezmay
Как известно, в 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
up
Iron Bug
всё, что я видела опенсорцного для работы со звуком в сети в реальном времени, было написано через VLC.
я не могу сказать наверняка, но у меня нет уверенности, что Qt вообще заточена под такие задачи.
тут же где-то пиарили какую-то библиотеку для работы с потоками звука. вот буквально недавно. может, тебе стоит посмотреть в сторону специфических риалтаймовских библиотек.
eg015t
mezmay, на чем порешили в конце? понимаю, конечно, что уже не актуальная тема. просто сам столкнулся сейчас
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.