我有一个现有的OpenGL / OpenCV应用程序,可以显示Video4Linux摄像机的图像。我想通过以太网将图像传输到其他计算机。不幸的是,由于现有应用程序已经占用了相机,因此我必须确保仅通过现有的OpenGL / OpenCV应用程序进行图像传输。我搜索了Internet,并想出了两个很好的资源:
[1] https://protecto.github.io/cpp-streaming-opencv-frames/
[2] http://derekmolloy.ie/udp-video-streaming-beaglebone-black/
就像参考文献[1]一样,我想流式传输OpenCV帧,因为我能够在我的应用程序中实现它。经过一些修改,我现在可以通过UDP连接发送OpenCV帧。对我而言,歧义是对流的解释。
std::vector<uchar> buf;
cv::imencode(".jpg", ACTUAL_FRAME, buf, std::vector<int>());
for (std::vector<uchar>::iterator it = buf.begin() ; it < buf.end(); it += chunk_size)
{
std::vector<uchar>::iterator end = it + chunk_size;
if (end >= buf.end()) {
end = buf.end();
}
std::string msg_str(it, end);
const void * msg = msg_str.c_str();
if (sendto(sockfd, msg, chunk_size, 0, (const struct sockaddr *) &servaddr, sizeof(servaddr)) == -1 )
{
printf("UDP Error: %s\n",strerror(errno));
fflush(stdout);
}
else{
//printf("UDP Send Successful!\n");
//fflush(stdout);
}
}
在当前实现中,数据以包含64000个未签名char的块的形式发送。我能够看到UDP服务器中的数据流。但是,我不知道通过UDP流mjpeg电影的实际标准方法或格式是什么。例如,使用VLC媒体播放器作为参考[2]。确实,我连接到dp://192.168.1.98:1234,这是我的应用程序发送数据的位置。但是我什么也看不到。
任何有关如何使用UDP服务器(例如VLC媒体播放器)解释JPG流的指南,或有关UDP客户端需要进行哪些修改的指南,都将受到极大的赞赏。