我目前正致力于一个从网络摄像头捕获视频的项目,并通过UDP发送编码流来进行实时流式传输。
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
VideoCapture cap(0); // open the video camera no. 0
double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video
while (1)
{
Mat frame;
bool bSuccess = cap.read(frame); // read a new frame from video
if (!bSuccess) //if not success, break loop
{
cout << "Cannot read a frame from video stream" << endl;
break;
}
return 0;
}
有些人说来自 cap.read(frame)的帧已经是解码后的帧,我不知道这是怎么回事。我想要的是编码的帧或流。我该怎么做才能得到它?我应该重新编码吗?
答案 0 :(得分:0)
根据the docs,调用VideoCapture::read()
相当于调用VideoCapture::grab()
然后调用VideoCapture::retrieve()
。
The docs for the Retrieve
function说它确实对帧进行了解码。
为什么不使用解码后的帧;大概在任何情况下你都会在远端解码它?
答案 1 :(得分:0)
OpenCV API不允许访问编码的帧。
您将不得不使用更低级别的库,可能取决于设备和平台。如果您的操作系统是Linux,Video4Linux2
可能是一个选项,则必须有适用于Windows / MacOS的库。您也可以查看mjpg-streamer,它与您想要实现的目标非常相似(仅限Linux)。
请注意,图像的确切编码取决于您的网络摄像头,某些USB网络摄像头支持mjpeg压缩(甚至是h264),但其他只能发送原始数据(通常在yuv色彩空间中)。
另一种选择是使用Opencv抓取解码图像,然后重新编码,例如使用imencode。它具有简单性和便携性的优点,但图像重新编码将使用更多资源。