crossplatform.ru

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


  Ответ в Проблемы с воспроизведением звука
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
eg015t Дата 15.6.2015, 16:51
  mezmay, на чем порешили в конце? понимаю, конечно, что уже не актуальная тема. просто сам столкнулся сейчас
Iron Bug Дата 17.12.2012, 13:49
  всё, что я видела опенсорцного для работы со звуком в сети в реальном времени, было написано через VLC.
я не могу сказать наверняка, но у меня нет уверенности, что Qt вообще заточена под такие задачи.
тут же где-то пиарили какую-то библиотеку для работы с потоками звука. вот буквально недавно. может, тебе стоит посмотреть в сторону специфических риалтаймовских библиотек.
mezmay Дата 17.12.2012, 8:37
  up
mezmay Дата 15.12.2012, 12:52
  Как известно, в 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? (то есть сделать чтобы приходящий новый буфер либо шел сразу на воспроизведение, либо аппендился к уже воспроизводящемуся)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 25.4.2024, 1:08