需要压缩QImage以通过IP发送它

时间:2011-05-10 15:30:15

标签: qt qimage

我正在编写一个应用程序(使用C ++ / Qt Designer 4.6并使用一些库,如ffmpegv4l2)从网络摄像头捕获,我想通过发送捕获的QImage IP,所以我把它发送到QTcpSocket,我在我的服务器应用程序中接收了它,但问题是它太慢了,因为QImage没有被压缩所以我没有得到通缉结果是通过IP直播视频,我的问题是如何压缩QImage?我认为在将其转换为YUV格式但我无法实现时,这是我的代码中的一些行以发送可用的QImage

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

4 个答案:

答案 0 :(得分:2)

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

MPEG压缩视频流使用的技术是对第一帧使用全尺寸图像,然后仅记录每个前进帧的更改像素,从而提供最大压缩以及通过网络平滑播放视频。

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

答案 1 :(得分:0)

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

QByteArray arr, cArr;
cArr = qCompress(arr);

答案 2 :(得分:0)

您应该遵循优化的第一条规则:如果您没有测量应用程序花费时间的位置,请不要进行优化。我认为你只是猜测你的应用程序哪个部分很慢。

答案 3 :(得分:0)

我遇到了与上面类似的问题,我的代码看起来像这样:

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

使用QElapsedTimer我发现对于1024x768大小的图像,对图像进行编码需要超过500毫秒。使用valgrind,我发现时间花费在 png_write_image 上,这是从 QImageWriter :: write(QImage)

调用的

更改代码以编码为JPG,使代码仅在5ms内执行同一图像。结果代码如下所示:

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

不幸的是我发现无法告诉QDataStream在JPG而不是PNG中编码图像,所以解码方面显然需要适应解码图像,如:

image.load(&buffer, "JPEG");