大型 Qt 外部二进制资源文件

Posted

技术标签:

【中文标题】大型 Qt 外部二进制资源文件【英文标题】:Large Qt external binary resource file 【发布时间】:2015-08-16 23:12:42 【问题描述】:

我想使用 Qt 外部资源文件作为我的 android 应用程序的扩展文件。资源文件中要捆绑的资源总大小为 700+ MB。我经历过资源编译器 (rcc) 在我的计算机挂起和崩溃之前无法处理超过 500MB 的大小。我真的很想制作大文件,因为这样可以更轻松地为 Android 上传扩展文件。

我使用以下参数从命令行运行 rcc 工具:

rcc -binary -no-compression myQrcFile.qrc -o myOutputFile

我需要不使用压缩才能直接播放资源文件中捆绑的视频文件,但这不是问题。

我有两个问题,但第一个是主要问题:

    有没有办法将总文件大小超过 500MB 的文件捆绑到一个文件中? 外部 Qt 资源文件的大小对应用程序的性能有影响吗?较大的文件 = 加载缓慢或类似情况?

【问题讨论】:

有趣的用例。是数据映射还是s-th?是否可以拆分数据? @ValentinHeinitz:数据是视频和图像。可以拆分数据,但是我必须将其压缩为一个文件并在目标(Android 设备)上解压缩。这增加了复杂性,如果可能,我想避免它。我个人认为 RCC 工具每个文件应该能够拥有超过 500 MB 的空间。 【参考方案1】:

为了创建较小的资源数据,您可以尝试更改压缩(s,-compress)

为了加快加载速度,在 Qt 中嵌入资源似乎有两种可能性。

除非您明确指定将资源数据创建为外部库,否则资源数据将嵌入可执行文件中,并将在应用程序启动时加载(对应用程序图标、字体等有意义)

如果您使用 -binary 选项编译数据

rcc -binary myresource.qrc -o myresource.rcc

您将把数据构建到一个动态库中,您可以在应用程序启动之后加载该动态库

QResource::registerResource("/path/to/myresource.rcc");

这里有一个关于 SO 的类似问题,但它侧重于资源的动态加载,而不是大小:How can I embed a Qt resource into a .dll file?

这些链接应该会有所帮助:

http://doc.qt.io/qt-5/resources.html

http://doc.qt.io/qt-5/rcc.html

【讨论】:

压缩不是一个选项,因为如果资源文件被压缩,视频将无法正常播放。它也无济于事,因为压缩前的原始文件大小似乎是限制因素。我在问题标题中指定了 external 二进制资源文件,因为我没有将它添加到可执行文件中。我正在使用 QResource 类。本题存在的问题是资源编译器(rcc)工具不能在一个文件中打包超过500MB。 我同意。在某些情况下,压缩效果不好或没有帮助。【参考方案2】:

我使用的是 32 位编译器 MinGW。我改用 MSVC 64 位编译器,可以创建大型外部资源文件。

【讨论】:

以上是关于大型 Qt 外部二进制资源文件的主要内容,如果未能解决你的问题,请参考以下文章

QT:资源文件的添加及使用

添加资源文件

QT应用程序 - 替换嵌入式资源

qt调用外部exe程序并且将exe程序一起打包

Qt入门教程项目篇rcc资源编译

官方认可的从 Qt5.x 下的资源播放音频的方式