Предел QBuffer & QBytearray составляет 2 ГБ? Как мне этого избежать?

Мое приложение вылетает, когда QBuffer объект или QByteArray объект достигает 2 ГБ.

Я искал существование предела QByteArray, но я не обнаружил предел QBuffer.

Согласно документации, QBuffer делает QByteArrayвнутренне. Так что я думаю, что это то же самое

в конце концов. Фактически, мое приложение вылетает. ИлиQBuffer сбросить данные с размера 0.

Я нашел решение в случае QByteArray.

Собственно говоря, в случае QByteArray, Я делаю много QByteArray объекты и вставить данные

в них соответственно. Все идет хорошо, потому что я думаю, что моему приложению не нужны сразу все данные в QByteArray.

Но в случае QBuffer, Я могу так поступить, но напрасно.

Потому как QMediaPlayer (например) не может ничего сыграть за партию QBuffer объект.

QBuffer объект должен иметь все данные для чтения, когда я что-то устанавливаю.

Как мне этого избежать? Это мое неправильное прочтение?

например:(Это для объяснения, а не для фрагмента)

a = QtCore.QBuffer()

b = QtCore.QBuffer()

data_is_3GB = b'xxx...'

a.write(2GB)

b.write(1GB)

QMediaPlayer.setMedia(QtMultimedia.QMediaContent(), a)

QMediaPlayer.play()

and at the end, 

QMediaPlayer.setMedia(QtMultimedia.QMediaContent(), b)

Могу ли я сыграть b после окончания a?

Нет другого выхода, кроме как сдаться?

На мой взгляд, лучший способ - это один раз создать файл размером 3 ГБ и установить его, а когда воспроизведение закончится, я удаляю файл.

Потому что в случае QFile объект QMediaPlayer может без проблем играть, даже если размер файла

очень большой. Но это очень косвенно.

1 ответ

Решение

Да, QByteArray может хранить данные размером менее 2 ГБ.

Есть вопросы на других страницах.

Максимальный размер QByteArray

Удалить ограничение 2G из массива bytearray

В соответствии с этим исправление принято в Qt6.

А вот и QBuffer документация.

По умолчанию внутренний буфер QByteArray создается для вас, когда вы создаете QBuffer. Вы можете получить доступ к этому буферу напрямую, вызвав buffer() . Вы также можете использовать QBuffer с существующим QByteArray, вызвав setBuffer() или передав свой массив конструктору QBuffer.

Я должен сдаться!

Теперь лучший способ - сделать напильник.

file = QtCore.QFile()
file.setFileName("...")
file.open(QtCore.QIODevice.ReadWrite)
for i in qbytearrays:
    file.write(i)
file.close()

QMediaPlayer.setMedia(QtMultimedia.QMediaContent(QtCore.QURL.fromLocal(file.fileName()), b)

Примечание: QMediaPlayer не воспроизводит второй загруженный файл. Чтобы этого избежать, мы должны заранее инициализировать его с помощью QMediaPlayer.setMedia(QtMultimedia.QMediaContent()).

Самая главная проблема заключается в том, что для создания нового файла требуется много времени в зависимости от размера файла.

Другие вопросы по тегам