crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 29.7.2025, 22:09