Russian Qt Forum
Ноябрь 22, 2024, 10:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAudioInput редактирование буфера  (Прочитано 7038 раз)
Evil_Genius
Гость
« : Июнь 03, 2015, 14:27 »

Записываю звук с помощью QAudioInput. Необходимо периодически "отрезать" начало записи, при этом не прерывая её. Делаю это через QBuffer::buffer() - доступный для записи QByteArray, привязанный к этому буферу, используя метод remove. Проверяю размер - всё отлично, вроде обрезалось. Однако на следующей итерации в буфере оказывается гораздо больше данных, как будто ничего не обрезалось.
  • Началась запись
  • Прошла 1 секунда
  • Вырезаю 1 секунду из буфера
  • Проверяю размер буфера - получаю 0
  • Прошла 1 секунда
  • Проверяю размер буфера - в буфере 2 записанных секунды, хотя должна быть только одна.
Может кто сталкивался с подобным или кто знает другой способ обрезания буфера "на лету"?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Июнь 04, 2015, 14:32 »

В каком конкретно месте производится модификация QBuffer? Описанное поведение подсказывает, что модификация QBuffer производится над его копией.
Записан
Evil_Genius
Гость
« Ответ #2 : Июнь 06, 2015, 18:52 »

В каком конкретно месте производится модификация QBuffer? Описанное поведение подсказывает, что модификация QBuffer производится над его копией.
Я использую void QAudioInput::start(QIODevice * device) для начала записи. Также используется QByteArray & QBuffer::buffer() для доступа к буферу. Где может создаваться копия?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Июнь 07, 2015, 00:57 »

Для интереса пересмотрел help к QAudioInput. Никакого QByteArray & QBuffer::buffer(), "привязанного к этому буферу", не обнаружил.
Давай код.
Записан
Evil_Genius
Гость
« Ответ #4 : Июнь 07, 2015, 06:32 »

Для интереса пересмотрел help к QAudioInput. Никакого QByteArray & QBuffer::buffer(), "привязанного к этому буферу", не обнаружил.
Давай код.
Вы видимо меня не совсем поняли. Запись начинается строчкой:
Код:
AudioInput->start(InputBuffer);
Справка пишет: "Starts transferring audio data from the system's audio input to the device." В данном случае device - InputBuffer, имеющий тип QBuffer.
А у QBuffer есть метод buffer(), возвращающий ссылку на QByteArray, который содержит данные этого QBuffer.
Код:
QByteArray & QBuffer::buffer()
Returns a reference to the QBuffer's internal buffer. You can use it to modify the QByteArray behind the QBuffer's back.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Июнь 07, 2015, 22:00 »

И всё же хотелось увидеть код.
Есть подозрения, что выглядит он как-то так:
Код
C++ (Qt)
QBuffer buf;
ai->start(&buf);
//    Вырезаю 1 секунду из буфера
QByteArray data = buf.buffer();
data.clear();
 
То есть создается объект (а не ссылка на него!) QByteArray c копией тех данных, которые связаны с QBuffer, и дальше чистится именно он, а не тот, который должен был вычиститься.
Записан
carrygun
Гость
« Ответ #6 : Июнь 08, 2015, 05:19 »

Одно время хотел связать QBuffer и QMediaPlayer, чтобы дописывать в буфер, а плеер бы это проигрывал, но оказалось что при установке источника, плеер работает с его копией. Возможно у QAudioInput такая же проблема.
Записан
Evil_Genius
Гость
« Ответ #7 : Июнь 08, 2015, 07:08 »

Я не использую промежуточную переменную.
Вот фрагмент кода:
Код:
qDebug() << InputBuffer->size();
InputBuffer->buffer()->remove(0, 15360);
qDebug() << InputBuffer->size();
size меняется как нужно, но на следующей "итерации", как будто этого и не было. Если работать напрямую с QByteArray (то есть создавать QBuffer со ссылкой на переменную QByteArray), то работает точно так же. Есть подозрения, что дело в seek/pos QBuffer'а.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Июнь 08, 2015, 07:39 »

2 Evil_Genius
Этот код не должен компилироваться, потому что метод buffer возвращает ссылку, а не указатель.

Каким образом объект QBuffer должен узнать о том, что вы вырезали данные из начала буфера? Попробуйте сами сдвигать указатель (seek) на нужное количество байт назад.
Записан
Evil_Genius
Гость
« Ответ #9 : Июнь 08, 2015, 08:43 »

2 Evil_Genius
Этот код не должен компилироваться, потому что метод buffer возвращает ссылку, а не указатель.

Каким образом объект QBuffer должен узнать о том, что вы вырезали данные из начала буфера? Попробуйте сами сдвигать указатель (seek) на нужное количество байт назад.

Да, загвоздка была именно в положении указателя буфера. Сдвигая его я добился нужного эффекта, даже не нужно вырезать данные. Спасибо за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 23.