【问题标题】:What is the best way to return an image or video file from a function using c++?使用 c++ 从函数返回图像或视频文件的最佳方法是什么?
【发布时间】:2012-03-24 07:35:25
【问题描述】:

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

【问题讨论】:

  • 您应该研究“流式传输”解决方案。本质上,如果您的函数可以一次对一大块数据进行操作,那么您只需将当前正在处理的少数数据块存储在内存中。下载时,一个块可以是一个缓冲区,它被传入的数据填满,并在它满时被写入磁盘。如果你这样做,你也可以为播放做类似的事情。
  • 而不是将其存储在磁盘上?

标签: c++ c image video


【解决方案1】:

可以使用zlib之类的东西在内存中进行压缩,在需要使用的时候再解压;但是,大多数现代计算机都有大量内存,因此您可以在需要开始压缩之前处理大量图像。对于实际上包含大量图像的视频,它变得更加重要 - 您倾向于在进行过程中解压缩,甚至可能在进行过程中从磁盘流式传输。

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

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

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

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

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

通过这种方式,您可以传入要加载图像的图像对象。不制作副本。如果您不使用异常,您还可以将“void”返回值更改为某种错误/状态代码。

【讨论】:

  • 感谢您的建议。我实际上是走这条路,减去创建图像类。我只是想将数据提取到内存中并返回它而不像你说的那样制作副本。我可以看到这个模型不适合视频文件,但对于图像文件,这应该没问题吧? (鉴于图像大小有硬性限制)
  • 见鬼,它也适用于小视频文件。不过,Image 类有一个很好的理由——它允许您稍后将存储更改为更复杂的类型,而无需使用您的类重写代码。从实现中抽象出接口对于编写可重用代码非常重要。最初的课程可能非常简单(可能只有 20-30 行),因此对于以后的巨大回报来说,前期工作真的不是很多。
【解决方案2】:

如果您担心要做什么,请编写代码来返回数组中的数据和将数据写入文件中......并将选择的责任传递给调用者。使您的功能类似于

/* 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 2013-05-18
    • 2010-09-07
    • 2021-10-29
    • 1970-01-01
    • 2013-10-31
    • 2010-09-30
    相关资源
    最近更新 更多