GStreamer - 无法 link Decodebin 元素 (NOFORMAT)
GStreamer - Cannot link Decodebin element (NOFORMAT)
我正在使用 GStreamer 1.10.4 以便在 Java 应用程序中执行原始视频流播放。
这是我在 Java 应用程序之外用于视频播放的命令:工作正常
gst-launch-1.0 -v udpsrc multicast-group=239.192.2.1 auto-multicast=true port="5000" caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string)1080, colorimetry=(string)BT709-2, payload=(int)96, a-framerate=(string)20" ! rtpvrawdepay ! decodebin ! videobox top=90 bottom=90 ! autovideosink sync=false
现在,我需要在我的 Java 应用程序中实施此管道。所以我正在使用:
- jna-4.4.0.jar
- gst1-java-core-0.9-161201.jar GStreamer java 包装器
- SimpleVideoComponent.java class,gstreamer-java 的一部分,以便将视频接收器嵌入 JFrame UI 对象
我能够在 Java 中构建简单的管道(如 videotestsrc !autovideosink),这些管道在我的 UI.
中正确显示
但是,当我按照上面的命令行中的描述构建我的原始流解码管道时,事情变得更难了。
提醒:udpsrc! rtpvrawdepay!解码箱!视频盒! autovideosink
问题是我无法 link 解码器的 src0 垫到视频盒的接收器垫:我收到一个 NOFORMAT 错误
这是我用于管道构造的相关代码:
String[] gstreamerArgs = new String[1];
gstreamerArgs[0] = "-v";
Gst.init("Video", gstreamerArgs);
mPipeline = new Pipeline("pipeline");
// Create elements =================================================================
elmt_udpsrc = ElementFactory.make("udpsrc", "udpsrc");
elmt_udpsrc.set("multicast-group", "239.192.2.1");
elmt_udpsrc.set("auto-multicast", true);
elmt_udpsrc.set("port", 5000);
Caps caps = new Caps("application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string)1080, colorimetry=(string)BT709-2, payload=(int)96, a-framerate=(string)20");
elmt_udpsrc.set("caps", caps);
elmt_rtpvrawdepay = ElementFactory.make("rtpvrawdepay", "rtpvrawdepay");
elmt_decodebin = ElementFactory.make("decodebin", "decodebin"); // has a "Sometimes" pad
elmt_decodebin.connect(new PAD_ADDED() {
@Override
public void padAdded(final Element element, final Pad pad) {
if (pad.isLinked()) {
return;
}
// Prints "Linking Decodebin pad : src_0 to sink"
System.out.println("VideoHandlerUI - Linking Decodebin pad : " + pad.getName() + " to " + elmt_autovideosink.getStaticPad("sink").getName());
PadLinkReturn retour = pad.link(elmt_videobox.getStaticPad("sink")); // NOFORMAT error !
inspect(mPipeline);
mPipeline.play();
}
});
elmt_videobox = ElementFactory.make("videobox", "videobox");
elmt_autovideosink = videoUIComponent.getElement();
elmt_autovideosink.set("sync", false);
// Build Pipeline =================================================================
mPipeline.addMany(elmt_udpsrc, elmt_rtpvrawdepay, elmt_decodebin, elmt_videobox, elmt_autovideosink);
bStatus1 = Element.linkMany(elmt_udpsrc, elmt_rtpvrawdepay, elmt_decodebin); // TRUE
bStatus2 = Element.linkMany(elmt_videobox, elmt_autovideosink); // TRUE
这是 padAdded 回调中 inspect(pipeline) 函数的输出,在 linking 尝试之后:
GstVideoComponent
Sink pad: sink connected to peer parent=BaseTransform: [videobox] / Pad: [src]
videobox
Sink pad: sink DISCONNECTED
Src pad: src connected to peer parent=AppSink: [GstVideoComponent] / Pad: [sink]
decodebin
Sink pad: sink connected to peer parent=Element: [rtpvrawdepay] / Pad: [src]
Sink pad: src_0 DISCONNECTED
rtpvrawdepay
Sink pad: sink connected to peer parent=BaseSrc: [udpsrc] / Pad: [src]
Src pad: src connected to peer parent=DecodeBin: [decodebin] / GhostPad: [sink]
udpsrc
Src pad: src connected to peer parent=Element: [rtpvrawdepay] / Pad: [sink]
我编写此管道的方式非常接近 other examples I found on the web。我不明白为什么我在这两个元素之间收到 NOFORMAT 错误,因为同一个管道都可以正常工作:
- 在命令行模式下
- 在 java 中将整个管道字符串传递给 GStreamer 绑定时(但这不是一个合适的解决方案,因为我需要控制管道元素)
我也尝试 link 将 decodebin 直接连接到 videosink 元素(不使用 videobox),但我得到了相同的结果。
关于我可能忘记在我的代码中的任何棘手的事情有什么想法吗?我怎样才能更深入地了解元素垫谈判中会发生什么?
我发现了问题。 appsink 功能与 decodebin 的功能不匹配。
我通过删除 decodebin 元素并将其替换为 videoconvert 元素解决了这个问题,并且视频播放正常。
我正在使用 GStreamer 1.10.4 以便在 Java 应用程序中执行原始视频流播放。
这是我在 Java 应用程序之外用于视频播放的命令:工作正常
gst-launch-1.0 -v udpsrc multicast-group=239.192.2.1 auto-multicast=true port="5000" caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string)1080, colorimetry=(string)BT709-2, payload=(int)96, a-framerate=(string)20" ! rtpvrawdepay ! decodebin ! videobox top=90 bottom=90 ! autovideosink sync=false
现在,我需要在我的 Java 应用程序中实施此管道。所以我正在使用:
- jna-4.4.0.jar
- gst1-java-core-0.9-161201.jar GStreamer java 包装器
- SimpleVideoComponent.java class,gstreamer-java 的一部分,以便将视频接收器嵌入 JFrame UI 对象
我能够在 Java 中构建简单的管道(如 videotestsrc !autovideosink),这些管道在我的 UI.
中正确显示但是,当我按照上面的命令行中的描述构建我的原始流解码管道时,事情变得更难了。
提醒:udpsrc! rtpvrawdepay!解码箱!视频盒! autovideosink
问题是我无法 link 解码器的 src0 垫到视频盒的接收器垫:我收到一个 NOFORMAT 错误
这是我用于管道构造的相关代码:
String[] gstreamerArgs = new String[1];
gstreamerArgs[0] = "-v";
Gst.init("Video", gstreamerArgs);
mPipeline = new Pipeline("pipeline");
// Create elements =================================================================
elmt_udpsrc = ElementFactory.make("udpsrc", "udpsrc");
elmt_udpsrc.set("multicast-group", "239.192.2.1");
elmt_udpsrc.set("auto-multicast", true);
elmt_udpsrc.set("port", 5000);
Caps caps = new Caps("application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string)1080, colorimetry=(string)BT709-2, payload=(int)96, a-framerate=(string)20");
elmt_udpsrc.set("caps", caps);
elmt_rtpvrawdepay = ElementFactory.make("rtpvrawdepay", "rtpvrawdepay");
elmt_decodebin = ElementFactory.make("decodebin", "decodebin"); // has a "Sometimes" pad
elmt_decodebin.connect(new PAD_ADDED() {
@Override
public void padAdded(final Element element, final Pad pad) {
if (pad.isLinked()) {
return;
}
// Prints "Linking Decodebin pad : src_0 to sink"
System.out.println("VideoHandlerUI - Linking Decodebin pad : " + pad.getName() + " to " + elmt_autovideosink.getStaticPad("sink").getName());
PadLinkReturn retour = pad.link(elmt_videobox.getStaticPad("sink")); // NOFORMAT error !
inspect(mPipeline);
mPipeline.play();
}
});
elmt_videobox = ElementFactory.make("videobox", "videobox");
elmt_autovideosink = videoUIComponent.getElement();
elmt_autovideosink.set("sync", false);
// Build Pipeline =================================================================
mPipeline.addMany(elmt_udpsrc, elmt_rtpvrawdepay, elmt_decodebin, elmt_videobox, elmt_autovideosink);
bStatus1 = Element.linkMany(elmt_udpsrc, elmt_rtpvrawdepay, elmt_decodebin); // TRUE
bStatus2 = Element.linkMany(elmt_videobox, elmt_autovideosink); // TRUE
这是 padAdded 回调中 inspect(pipeline) 函数的输出,在 linking 尝试之后:
GstVideoComponent
Sink pad: sink connected to peer parent=BaseTransform: [videobox] / Pad: [src]
videobox
Sink pad: sink DISCONNECTED
Src pad: src connected to peer parent=AppSink: [GstVideoComponent] / Pad: [sink]
decodebin
Sink pad: sink connected to peer parent=Element: [rtpvrawdepay] / Pad: [src]
Sink pad: src_0 DISCONNECTED
rtpvrawdepay
Sink pad: sink connected to peer parent=BaseSrc: [udpsrc] / Pad: [src]
Src pad: src connected to peer parent=DecodeBin: [decodebin] / GhostPad: [sink]
udpsrc
Src pad: src connected to peer parent=Element: [rtpvrawdepay] / Pad: [sink]
我编写此管道的方式非常接近 other examples I found on the web。我不明白为什么我在这两个元素之间收到 NOFORMAT 错误,因为同一个管道都可以正常工作:
- 在命令行模式下
- 在 java 中将整个管道字符串传递给 GStreamer 绑定时(但这不是一个合适的解决方案,因为我需要控制管道元素)
我也尝试 link 将 decodebin 直接连接到 videosink 元素(不使用 videobox),但我得到了相同的结果。
关于我可能忘记在我的代码中的任何棘手的事情有什么想法吗?我怎样才能更深入地了解元素垫谈判中会发生什么?
我发现了问题。 appsink 功能与 decodebin 的功能不匹配。 我通过删除 decodebin 元素并将其替换为 videoconvert 元素解决了这个问题,并且视频播放正常。