В настоящее время я работаю над потоковым проектом. Мне нужно взять кадры с USB-камеры и отправить их по TCP.
Для открытия видеопотока с USB-камеры я использую cv::VideoCapture
. Это позволяет мне читать уже декодированные кадры. В соответствии с этим вопросом я понял, что нет способа получить кодированные данные кадра, используя cv::VideoCapture
, и мне нужно снова кодировать каждый кадр и отправлять все, что мне нужно, используя cv::imencode
. Проблема в том, что я могу кодировать кадры в какой-то определенный формат, указанный здесь здесь , и, в случае, я использую либо .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();
}