如何在 QML VideoItem 中包含 gstreamer 接收器?
How to include a gstreamer sink in a QML VideoItem?
我正在尝试使用 QML 将 gsrtreamer 视频集成到 QT 应用程序中。
我从使用远程视频的示例 qmlplayer2 开始:
player->setUri(QLatin1Literal("http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi"));
我已修改此示例以使用管道获取 udpsrc :
m_pipeline = QGst::Pipeline::create();
QGst::ElementPtr udp = QGst::ElementFactory::make(QLatin1Literal("udpsrc"));
udp->setProperty("address", "192.168.1.1");
udp->setProperty("port", 3333);
QGst::ElementPtr decodage = QGst::ElementFactory::make("jpegdec");
QGst::ElementPtr videosink = QGst::ElementFactory::make("autovideosink");
相当于:
gst-launch-1.0 udpsrc address=192.168.1.1 port=3333 ! jpegdec ! autovideosink
这很有效,我可以播放我的视频并且我的 play/pause/stop 按钮可以正常工作。
但是视频是不同的 window
而我的 QML 指定 VideoItem 在主 window 中:
Rectangle {
id: window
width: 600
height: 300
Column {
width: 600
height: 544
y : 10;
VideoItem {
id: video
y : 10;
width: window.width
height: 260
surface: videoSurface1 //bound on the context from main()
}
// Other buttons
我找到的每个主题要么太旧(gstreamer 自今年 5.5 起在 Qt 中原生使用)要么没有答案
我的工作有错误吗?
还有其他方法可以做我想做的事吗?
谢谢。
这里的问题是 autovideosink 没有实现 "GstVideoOverlay"。在您的管道中,您应该使用此元素之一作为接收器元素 "xvimagesink,ximagesink" 或直接使用 "playbin",此元素实现 "GstVideoOverlay" 接口。
这里是一个使用 "playbin" 的例子。请注意,此示例使用的是没有 QT 包装器的纯 Gstreamer。
GstElement *pipeline = gst_element_factory_make("playbin", "playbin");
/* Set the URI to play */
g_object_set(pipeline, "uri", url, NULL);
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(pipeline), windowsID);
*windowsID 是您要在其中绘制视频输出的小部件 ID。
*url 是您的视频 url。因为你会 "udp://192.168.1.1:3333"
我正在尝试使用 QML 将 gsrtreamer 视频集成到 QT 应用程序中。
我从使用远程视频的示例 qmlplayer2 开始:
player->setUri(QLatin1Literal("http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi"));
我已修改此示例以使用管道获取 udpsrc :
m_pipeline = QGst::Pipeline::create();
QGst::ElementPtr udp = QGst::ElementFactory::make(QLatin1Literal("udpsrc"));
udp->setProperty("address", "192.168.1.1");
udp->setProperty("port", 3333);
QGst::ElementPtr decodage = QGst::ElementFactory::make("jpegdec");
QGst::ElementPtr videosink = QGst::ElementFactory::make("autovideosink");
相当于:
gst-launch-1.0 udpsrc address=192.168.1.1 port=3333 ! jpegdec ! autovideosink
这很有效,我可以播放我的视频并且我的 play/pause/stop 按钮可以正常工作。
但是视频是不同的 window
而我的 QML 指定 VideoItem 在主 window 中:
Rectangle {
id: window
width: 600
height: 300
Column {
width: 600
height: 544
y : 10;
VideoItem {
id: video
y : 10;
width: window.width
height: 260
surface: videoSurface1 //bound on the context from main()
}
// Other buttons
我找到的每个主题要么太旧(gstreamer 自今年 5.5 起在 Qt 中原生使用)要么没有答案
我的工作有错误吗?
还有其他方法可以做我想做的事吗?
谢谢。
这里的问题是 autovideosink 没有实现 "GstVideoOverlay"。在您的管道中,您应该使用此元素之一作为接收器元素 "xvimagesink,ximagesink" 或直接使用 "playbin",此元素实现 "GstVideoOverlay" 接口。
这里是一个使用 "playbin" 的例子。请注意,此示例使用的是没有 QT 包装器的纯 Gstreamer。
GstElement *pipeline = gst_element_factory_make("playbin", "playbin");
/* Set the URI to play */
g_object_set(pipeline, "uri", url, NULL);
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(pipeline), windowsID);
*windowsID 是您要在其中绘制视频输出的小部件 ID。 *url 是您的视频 url。因为你会 "udp://192.168.1.1:3333"