Название: QAudioInput редактирование буфера Отправлено: Evil_Genius от Июнь 03, 2015, 14:27 Записываю звук с помощью QAudioInput. Необходимо периодически "отрезать" начало записи, при этом не прерывая её. Делаю это через QBuffer::buffer() - доступный для записи QByteArray, привязанный к этому буферу, используя метод remove. Проверяю размер - всё отлично, вроде обрезалось. Однако на следующей итерации в буфере оказывается гораздо больше данных, как будто ничего не обрезалось.
Название: Re: QAudioInput редактирование буфера Отправлено: xokc от Июнь 04, 2015, 14:32 В каком конкретно месте производится модификация QBuffer? Описанное поведение подсказывает, что модификация QBuffer производится над его копией.
Название: Re: QAudioInput редактирование буфера Отправлено: Evil_Genius от Июнь 06, 2015, 18:52 В каком конкретно месте производится модификация QBuffer? Описанное поведение подсказывает, что модификация QBuffer производится над его копией. Я использую void QAudioInput::start(QIODevice * device) для начала записи. Также используется QByteArray & QBuffer::buffer() для доступа к буферу. Где может создаваться копия?Название: Re: QAudioInput редактирование буфера Отправлено: xokc от Июнь 07, 2015, 00:57 Для интереса пересмотрел help к QAudioInput. Никакого QByteArray & QBuffer::buffer(), "привязанного к этому буферу", не обнаружил.
Давай код. Название: Re: QAudioInput редактирование буфера Отправлено: Evil_Genius от Июнь 07, 2015, 06:32 Для интереса пересмотрел help к QAudioInput. Никакого QByteArray & QBuffer::buffer(), "привязанного к этому буферу", не обнаружил. Вы видимо меня не совсем поняли. Запись начинается строчкой:Давай код. Код: AudioInput->start(InputBuffer); А у QBuffer есть метод buffer(), возвращающий ссылку на QByteArray, который содержит данные этого QBuffer. Код: QByteArray & QBuffer::buffer() Название: Re: QAudioInput редактирование буфера Отправлено: xokc от Июнь 07, 2015, 22:00 И всё же хотелось увидеть код.
Есть подозрения, что выглядит он как-то так: Код То есть создается объект (а не ссылка на него!) QByteArray c копией тех данных, которые связаны с QBuffer, и дальше чистится именно он, а не тот, который должен был вычиститься. Название: Re: QAudioInput редактирование буфера Отправлено: carrygun от Июнь 08, 2015, 05:19 Одно время хотел связать QBuffer и QMediaPlayer, чтобы дописывать в буфер, а плеер бы это проигрывал, но оказалось что при установке источника, плеер работает с его копией. Возможно у QAudioInput такая же проблема.
Название: Re: QAudioInput редактирование буфера Отправлено: Evil_Genius от Июнь 08, 2015, 07:08 Я не использую промежуточную переменную.
Вот фрагмент кода: Код: qDebug() << InputBuffer->size(); Название: Re: QAudioInput редактирование буфера Отправлено: Old от Июнь 08, 2015, 07:39 2 Evil_Genius
Этот код не должен компилироваться, потому что метод buffer возвращает ссылку, а не указатель. Каким образом объект QBuffer должен узнать о том, что вы вырезали данные из начала буфера? Попробуйте сами сдвигать указатель (seek) на нужное количество байт назад. Название: Re: QAudioInput редактирование буфера Отправлено: Evil_Genius от Июнь 08, 2015, 08:43 2 Evil_Genius Да, загвоздка была именно в положении указателя буфера. Сдвигая его я добился нужного эффекта, даже не нужно вырезать данные. Спасибо за помощь.Этот код не должен компилироваться, потому что метод buffer возвращает ссылку, а не указатель. Каким образом объект QBuffer должен узнать о том, что вы вырезали данные из начала буфера? Попробуйте сами сдвигать указатель (seek) на нужное количество байт назад. |