2

我正在编写一个从网络摄像头捕获的应用程序(在 C++/Qt Designer 4.6 中并使用一些像ffmpegand之类的库v4l2),我想QImage通过 IP 发送捕获的内容,所以我将它发送到 aQTcpSocket并成功在我的服务器应用程序中接收它但问题是它太慢了,显然是因为QImage没有压缩,所以我没有得到想要的结果,即通过 IP 进行实时视频流,我的问题是如何压缩QImage?我认为将其转换为YUV格式但我无法意识到,这是我的代码中用于发送可用的一些行QImage

QImage image;
QByteArray ba;
QBuffer buffer(&ba);
image.save(&buffer, "PNG");
imsocket->write(ba);
4

4 回答 4

2

您最好发送一个 MPEG 压缩视频流,而不是将每个帧压缩为 QImage 并通过网络发送。

MPEG 压缩视频流使用一种技术,该技术在第一帧使用全尺寸图像,然后只记录每个进行中的帧的变化像素,从而提供最大的压缩以及通过网络进行流畅的视频播放。

在客户端,您将通过从压缩的 MPEG 流中获取库生成的帧来进行播放。

于 2011-05-16T12:31:19.757 回答
1

我遇到了与上面类似的问题,我的代码如下所示:

QBuffer buffer;
buffer.open(QIOdevice::WriteOnly);
QDataStream stream(&buffer);
stream << image;

使用 QElapsedTimer,我发现对 1024x768 大小的图像进行编码需要 500 多毫秒。使用 valgrind 我发现时间花在了从 QImageWriter::write(QImage) 调用的png_write_image

将代码更改为 JPG 编码,使同一图像的代码仅在 5 毫秒内执行。生成的代码如下所示:

QBuffer buffer;
buffer.open(QIODevice::WriteOnly);
image.save(&buffer,"JPEG");

不幸的是,我没有办法告诉 QDataStream 以 JPG 而不是 PNG 编码图像,因此解码端显然需要适应解码图像,例如:

image.load(&buffer, "JPEG");
于 2014-03-22T10:21:09.617 回答
0

在发送图像之前,您可以压缩字节数组,然后在服务器上对其进行解压缩。这应该为您提供很好的推动力。

QByteArray arr, cArr;
cArr = qCompress(arr);
于 2011-05-10T17:59:24.273 回答
0

您应该遵守优化的第一条规则:当您没有衡量您的应用程序将时间花在哪里时,不要进行优化。我假设您只是在猜测您的应用程序的哪一部分很慢。

于 2011-05-16T11:38:55.220 回答