目前,我正在从事流媒体项目。我需要从USB摄像头抓取帧并通过TCP发送。
要打开USB摄像机视频流,请使用cv::VideoCapture
。这使我可以读取已经解码的帧。根据{{3}}问题,我了解到无法使用cv::VideoCapture
获取编码的帧数据,因此我需要再次对每个帧进行编码,然后使用cv::imencode
将其发送给我。问题是我可以将帧编码为this中列出的某些特定格式,并且如果使用.jpg或.png,则文件大小仍然很大,并且接收端的帧率非常差。
我的问题是:有什么方法可以直接获取mjpeg或h264编码的数据 或者也许您可以建议一种更好的帧编码方式。
OpenCV 3.4.3,摄像机RICOH THETA V,语言C ++。
我的代码:
void Streamer::start()
{
cv::Mat img;
cv::VideoCapture cap(0);
cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC('H', '2', '6', '4'));
if (!cap.isOpened())
throw std::invalid_argument("No device found.");
std::vector<int> format_params;
format_params.push_back(CV_LOAD_IMAGE_COLOR);
format_params.push_back(CV_IMWRITE_PNG_STRATEGY);
for (;;)
{
cap.read(img);
cv::imencode(".png", img, buffer_, format_params);
std::string strbuf(buffer_.begin(), buffer_.end());
server_->sendString(socket, strbuf);
}
cap.release();
}