Предел 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()).
Самая главная проблема заключается в том, что для создания нового файла требуется много времени в зависимости от размера файла.