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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 17.12.2012, 8:37
Сообщение #2


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

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

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




Репутация:   1  


up
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 17.12.2012, 13:49
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1601
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


всё, что я видела опенсорцного для работы со звуком в сети в реальном времени, было написано через VLC.
я не могу сказать наверняка, но у меня нет уверенности, что Qt вообще заточена под такие задачи.
тут же где-то пиарили какую-то библиотеку для работы с потоками звука. вот буквально недавно. может, тебе стоит посмотреть в сторону специфических риалтаймовских библиотек.

Сообщение отредактировал Iron Bug - 17.12.2012, 13:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eg015t
  опции профиля:
сообщение 15.6.2015, 16:51
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 15.6.2015
Пользователь №: 4402

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




Репутация:   0  


mezmay, на чем порешили в конце? понимаю, конечно, что уже не актуальная тема. просто сам столкнулся сейчас
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.1.2021, 17:13