如何在 QT 中使用 udpsrc 管道流式传输视频
How can i stream video using udpsrc pipeline in QT
Server Windows:
gst-launch-1.0.exe videotestsrc ! rtpvraewpay ! udpsink host=192.168.101.111 port=8001
客户端 Linux:
我使用以下管道,我可以显示测试视频rc视频:
gst-launch-1.0 udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)RAW,width=(string)480,height=(string)360,payload=(int)96" port=8001 ! rtpvrawdepay ! videoconvert ! glimagesink
但是我无法使用以下c ++代码在QWidget上显示测试视频:
ScreenWidgets.append(new CamWidget(this));
ui->gridLayout_screens->addWidget(ScreenWidgets.last());
WId windowId= ScreenWidgets.last()->winId();
GtElement *pipeline = gst_pipeline_new("udp_pipeline");
GstElement *source = gst_element_factory_make("udpsrc","source");
GstElement *depayloader = gst_element_factory_make("rtpvrawdepay","depayl");
GstElement *q1 = gst_element_factory_make("queue", "qone1");
GstElement *convert1 = gst_element_factory_make("videoconvert","conv");
GstElement *q2 = gst_element_factory_make("queue", "q2");
GstElement *sink = gst_element_factory_make("glimagesink","sink");
GstCaps *caps = gst_caps_new_simple("application/x-rtp",
"media", G_TYPE_STRING, "video",
"clock-rate",G_TYPE_INT,90000,
"encoding-name", G_TYPE_STRING,"RAW",
"width",G_TYPE_STRING,"640",
"height",G_TYPE_STRING,"480",
"payload",G_TYPE_INT,96,
NULL);
if(source != NULL && depayloader != NULL
&& convert1 != NULL && q1 && q2
&& sink!= NULL && caps != NULL)
{
g_object_set(GST_OBJECT(sink),"sync",FALSE,NULL);
g_object_set(GST_OBJECT(sink),"enable-last-sample",TRUE,NULL);
g_object_set(G_OBJECT(source),"port",8001,NULL);
//g_object_set(G_OBJECT(source),"buffer-size",640000,NULL);
gst_bin_add_many (GST_BIN (pipeline), source, depayloader, NULL);
gst_bin_add_many (GST_BIN (pipeline), convert1 ,q2, q1, sink, NULL);
if(gst_element_link_many(depayloader,
q1,
convert1,
q2,
sink,
NULL))
{
if(gst_element_link_filtered(source,depayloader,caps))
{
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sink),windowId);
GThread *thread = g_thread_new(NULL,(GThreadFunc)func,loop);
}
}
}
谁能帮我哪里错?
谢谢
使用 gst_parse_launch(( 创建管道对我有用。
GstElement *pipeline_2= gst_parse_launch("udpsrc port=20000 ! application/x-rtp,encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegparse ! jpegdec ! videoconvert ! videoscale ! ximagesink name=mySink", NULL);
GstElement *sink = gst_bin_get_by_name((GstBin*)pipeline_2,"mySink");
QWidget *window = new QWidget();
window->setWindowTitle("udpsrc video stream");
window->resize(700, 700);
WId xwinid = window->winId();
gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), (guintptr)xwinid);
window->show();
GstStateChangeReturn sret = gst_element_set_state (pipeline_2, GST_STATE_PLAYING);
希望这有帮助。
相关文章:
- 如何在 QT 中使用 udpsrc 管道流式传输视频
- 如何在 Linux C++ 应用程序中通过管道传输到 ifstream
- 如何将 Python 脚本通过管道传输到命令(boost::p rogram::options)
- 如何正确使用管道将数据从子过程传输到父过程
- C++ microshell,输入一个命令并使用fork(),dup(),pipe()将其通过管道传输到进程。只是我没有得到我想要的结果
- 通过管道将自定义标准输入传输到C++中的系统调用
- C++程序在管道传输时性能更好
- 如何将OpenCV图像推送到GStreamer管道中,以便通过TCPServer接收器进行流式传输
- 通过管道将输入从 Bash 传输到 C++ cin 中
- OpenCV(用C++编程)stdout通过管道传输到ffmpeg(在bashscript中)
- 有没有办法检查外部数据是否通过管道传输到程序或程序是否自行运行
- gstreamer 管道代码,用于通过来自相机的实时流式传输而不是图像显示文本
- 如何将 gdb 的完整堆栈跟踪通过管道传输到文件?
- 将输入管道传输到c++程序中以在Visual Studio中进行调试
- 将外部进程的输出管道传输到正在运行的脚本C++
- c++getline似乎无法识别通过管道传输到stdin的输入中的换行符
- 将一个c++程序的输出管道传输到另一个程序
- 为什么我不能通过管道传输两个 execl 调用的输出?
- 在不同平台上通过管道传输数据的最佳和安全方式
- 使用命名(fifo)管道在python和c++之间传输数组(图像)