我正在编写一个c ++库,使用libcurl从云服务器获取并返回图像数据或视频数据。我已经开始编写一些测试代码,但仍然坚持设计API,因为我不确定处理这些媒体文件的最佳方法。将它作为二进制数据存储在char / string变量中似乎可行,但我想知道如果文件太大,是否会占用太多RAM内存。我是新手,所以请提出解决方案。
答案 0 :(得分:0)
你可以使用类似zlib的东西在内存中压缩它,然后只在需要使用时解压缩它;但是,大多数现代计算机都有相当多的内存,所以在需要开始压缩之前,你可以处理很多图像。对于实际上很多图像的视频来说,它变得更加重要 - 您可以随时进行解压缩,甚至可以随时从磁盘流式传输。
从API的角度来看,处理此问题的常用方法是使用Image对象和Video对象(类)。这些对象具有“获取”未压缩图像/帧的功能。 “get”函数将检查数据当前是否被压缩;如果是,它会在返回之前将其解压缩;如果没有压缩,它可以立即返回。实际存储数据的方式(压缩/未压缩/在磁盘/内存中)以及如何使用它的细节因此隐藏在“获取”功能之后。最重要的是,这个模型可以让你以后改变主意,添加其他类型的压缩,添加磁盘流支持等,而无需改变调用get()函数的代码的编写方式。
另一个挑战是如何从函数返回图像或视频对象。你可以这样做:
Image getImageFromURL( const std::string &url );
但这有一个有趣的问题,即图像在返回过程中被“复制”(有时候取决于编译器如何优化)。这种方式更节省内存:
void getImageFromURL( const std::string &url, Image &result );
这样,您可以传入要加载图像的图像对象。没有制作副本。如果您没有使用异常,也可以将'void'返回值更改为某种错误/状态代码。
答案 1 :(得分:0)
如果您担心该怎么做,请将数据返回到数组中以及将数据写入文件中的代码...并传递责任以选择调用者。使你的功能像
/* one of dst and outfile should be NULL */
/* if dst is not NULL, dstlen specifies the size of the array */
/* if outfile is not NULL, data is written to that file */
/* the return value indicates success (0) or reason for failure */
int getdata(unsigned char *dst, size_t dstlen,
const char *outfile,
const char *resource);