我正在编写一个应用程序(使用C ++ / Qt Designer 4.6并使用一些库,如ffmpeg
和v4l2
)从网络摄像头捕获,我想通过发送捕获的QImage
IP,所以我把它发送到QTcpSocket
,我在我的服务器应用程序中接收了它,但问题是它太慢了,因为QImage
没有被压缩所以我没有得到通缉结果是通过IP直播视频,我的问题是如何压缩QImage
?我认为在将其转换为YUV
格式但我无法实现时,这是我的代码中的一些行以发送可用的QImage
:
QImage image;
QByteArray ba;
QBuffer buffer(&ba);
image.save(&buffer, "PNG");
imsocket->write(ba);
答案 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");