Russian Qt Forum

Qt => Мультимедиа => Тема начата: Evil_Genius от Июнь 03, 2015, 14:27



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


Название: 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);
Справка пишет: "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.


Название: Re: QAudioInput редактирование буфера
Отправлено: xokc от Июнь 07, 2015, 22:00
И всё же хотелось увидеть код.
Есть подозрения, что выглядит он как-то так:
Код
C++ (Qt)
QBuffer buf;
ai->start(&buf);
//    Вырезаю 1 секунду из буфера
QByteArray data = buf.buffer();
data.clear();
 
То есть создается объект (а не ссылка на него!) QByteArray c копией тех данных, которые связаны с QBuffer, и дальше чистится именно он, а не тот, который должен был вычиститься.


Название: Re: QAudioInput редактирование буфера
Отправлено: carrygun от Июнь 08, 2015, 05:19
Одно время хотел связать QBuffer и QMediaPlayer, чтобы дописывать в буфер, а плеер бы это проигрывал, но оказалось что при установке источника, плеер работает с его копией. Возможно у QAudioInput такая же проблема.


Название: Re: QAudioInput редактирование буфера
Отправлено: Evil_Genius от Июнь 08, 2015, 07:08
Я не использую промежуточную переменную.
Вот фрагмент кода:
Код:
qDebug() << InputBuffer->size();
InputBuffer->buffer()->remove(0, 15360);
qDebug() << InputBuffer->size();
size меняется как нужно, но на следующей "итерации", как будто этого и не было. Если работать напрямую с QByteArray (то есть создавать QBuffer со ссылкой на переменную QByteArray), то работает точно так же. Есть подозрения, что дело в seek/pos QBuffer'а.


Название: 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) на нужное количество байт назад.

Да, загвоздка была именно в положении указателя буфера. Сдвигая его я добился нужного эффекта, даже не нужно вырезать данные. Спасибо за помощь.