c++ - 使用 C++ 从函数返回图像或视频文件的最佳方法是什么?

标签 c++ c image video

我正在编写一个 C++ 库,它使用 libcurl 从云服务器获取和返回图像数据或视频数据。我已经开始编写一些测试代码,但仍然停留在设计 API 上,因为我不确定处理这些媒体文件的最佳方法是什么。将其作为二进制数据存储在 char/string 变量中似乎可行,但我想知道如果文件太大,这是否会占用太多 RAM 内存。我对此很陌生,所以请提出解决方案。

最佳答案

可以使用zlib之类的东西将其压缩在内存中,然后仅在需要使用时才解压缩;然而,大多数现代计算机都具有相当大的内存,因此您可以在需要开始压缩之前处理相当多的图像。对于视频(实际上是大量图像),它变得更加重要 - 您倾向于在播放时解压缩,甚至可能在播放时从磁盘流式传输。

从 API 的角度来看,处理此问题的常用方法是使用 Image 对象和 Video 对象(类)之类的东西。这些对象将具有“获取”未压缩图像/帧的功能。 “get”函数将检查数据当前是否被压缩;如果是,则在返回之前将其解压;如果没有压缩,可以立即返回。因此,数据实际存储的方式(压缩/未压缩/在磁盘上/在内存中)以及如何使用它的细节隐藏在“get”函数后面。最重要的是,这个模型可以让您稍后改变主意,添加其他类型的压缩,添加磁盘流支持等,而无需更改调用 get() 函数的代码的编写方式。

另一个挑战是如何从函数返回图像或视频对象。你可以这样做:

Image getImageFromURL( const std::string &url );

但这有一个有趣的问题,即图像在返回过程中被“复制”(有时;取决于编译器如何优化)。这种方式内存效率更高:

void getImageFromURL( const std::string &url, Image &result );

这样,您就可以传入要加载图像的图像对象。不制作任何拷贝。如果您不使用异常,您还可以将“void”返回值更改为某种错误/状态代码。

关于c++ - 使用 C++ 从函数返回图像或视频文件的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9590219/

相关文章:

c - ceil()和floor()的实现

c++ - 如何使用 C++ 从 OpenCV 中的框架中删除黑色边框?

css - 由于 CSS 背景图像,SSL 和混合内容

Javascript 随机背景右上固定

c - 调用 strcpy 的结果与预期不同

c - 数组的两个参数并读取列

C++高内存和CPU

c++ - boost 灵气 : binding to struct with vector of tuples

C++ 倒置加权随机播放

c++ - 实例化特定模板特化时断言