使用 RTSP 从 Opencv 处理后从 PC 将视频流式传输到 Android
Video Streaming to Android from PC after processing from Opencv using RTSP
我正在尝试将从两个网络摄像头拍摄的组合视频流在 opencv 中处理后流式传输到 android 应用程序(组合两个帧)。
我在这里尝试使用 RTSP 将视频流从 opencv 发送到 Android(使用 gstreamer 管道)。
但我一直卡在如何向客户端发送 .sdp 文件配置(文件名为 live.sdp),这是我目前使用的代码。
//basic
#include <iostream>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
//opencv libraries
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main(int argc,char **argv){
Mat im1;
Mat im2;
VideoCapture cap1(1);
VideoCapture cap2(2);
VideoWriter video;
video.open("appsrc ! videoconvert ! x264enc noise-reduction=10000 tune=zerolatency byte-stream=true threads=4 ! mpegtsmux ! rtpmp2tpay send-config=true config-interval=10 pt=96 ! udpsink host=localhost port=5000 -v"
, 0, (double)20,Size(1280, 480), true);
if(video.isOpened()){
cout << "Video Writer is opened!"<<endl;
}else{
cout << "Video Writer is Closed!"<<endl;
return -1;
}
while(1){
cap1.grab();
cap2.grab();
bool bSuccess1 = cap1.read(im2);
bool bSuccess2 = cap2.read(im1);
Size sz1 = im1.size();
Size sz2 = im2.size();
Mat im3(sz1.height, sz1.width+sz2.width, CV_8UC3);
Mat left(im3, Rect(0, 0, sz1.width, sz1.height));
im1.copyTo(left);
Mat right(im3, Rect(sz1.width, 0, sz2.width, sz2.height));
im2.copyTo(right);
video << im3;
//imshow("im3", im3);
if(waitKey(10) == 27){
break;
}
}
cap1.release();
cap2.release();
video.release();
return 0;
}
和.sdp文件配置,
v=0
m=video 5000 RTP/AVP 96
c=IN IP4 localhost
a=rtpmap:96 MP2T/90000
我可以在本地文件夹中播放来自vlc的流,
使用
vlc live.sdp
但不在网络内部,通过使用,
vlc rtsp://localhost:5000/live.sdp
使用 Gstreamer 和 opencv 解决了问题,但仍然有小延迟。
我正在尝试将从两个网络摄像头拍摄的组合视频流在 opencv 中处理后流式传输到 android 应用程序(组合两个帧)。
我在这里尝试使用 RTSP 将视频流从 opencv 发送到 Android(使用 gstreamer 管道)。
但我一直卡在如何向客户端发送 .sdp 文件配置(文件名为 live.sdp),这是我目前使用的代码。
//basic
#include <iostream>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
//opencv libraries
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main(int argc,char **argv){
Mat im1;
Mat im2;
VideoCapture cap1(1);
VideoCapture cap2(2);
VideoWriter video;
video.open("appsrc ! videoconvert ! x264enc noise-reduction=10000 tune=zerolatency byte-stream=true threads=4 ! mpegtsmux ! rtpmp2tpay send-config=true config-interval=10 pt=96 ! udpsink host=localhost port=5000 -v"
, 0, (double)20,Size(1280, 480), true);
if(video.isOpened()){
cout << "Video Writer is opened!"<<endl;
}else{
cout << "Video Writer is Closed!"<<endl;
return -1;
}
while(1){
cap1.grab();
cap2.grab();
bool bSuccess1 = cap1.read(im2);
bool bSuccess2 = cap2.read(im1);
Size sz1 = im1.size();
Size sz2 = im2.size();
Mat im3(sz1.height, sz1.width+sz2.width, CV_8UC3);
Mat left(im3, Rect(0, 0, sz1.width, sz1.height));
im1.copyTo(left);
Mat right(im3, Rect(sz1.width, 0, sz2.width, sz2.height));
im2.copyTo(right);
video << im3;
//imshow("im3", im3);
if(waitKey(10) == 27){
break;
}
}
cap1.release();
cap2.release();
video.release();
return 0;
}
和.sdp文件配置,
v=0
m=video 5000 RTP/AVP 96
c=IN IP4 localhost
a=rtpmap:96 MP2T/90000
我可以在本地文件夹中播放来自vlc的流, 使用
vlc live.sdp
但不在网络内部,通过使用,
vlc rtsp://localhost:5000/live.sdp
使用 Gstreamer 和 opencv 解决了问题,但仍然有小延迟。