我使用v0.10.34 gstreamer核心,插件库等... 我开发了一个简单的过滤器来修改Y组件,但我想处理所有视频格式而不使用视频解码和我的过滤器之间的色彩空间转换器。
现在我使用以下cmd来测试我的过滤器:
../../Build/lin64_release/bin/gst-launch-0.10 -v filesrc location=input.mp4 ! decodebin2 name=dec ! ffmpegcolorspace ! myfilter silent=1 ! tee name=t \ t. ! queue ! filesink location=test.yuv \ t. ! queue ! ffmpegcolorspace ! ximagesink
我的第一个问题是,我如何强制/设置特定上限(视频格式)作为我的过滤器的输入?
第二个问题是,如果我只使用 YUY2 和 UYVY 作为模板创建模板,为什么我会以 I420 格式建立连接我的src和水槽垫?
欢迎所有关于这些主题的想法和好网址。
答案 0 :(得分:1)
对于第一个问题,看起来_set_caps
函数负责接受或拒绝具有给定大写字母的连接。为了实现这一点,我使用了一组支持的上限(定义为GstStaticCaps
),并在我的_set_caps
函数中,我检查了我收到的上限与我用作模板的GstStaticCaps的交集。
static gboolean
gst_myfilter_set_caps (GstPad * pad, GstCaps * caps)
{
Gstmyfilter *filter;
GstVideoFormat format;
int i, w, h;
gboolean isSupported;
filter = GST_NGPTVSTUB (gst_pad_get_parent (pad));
if(!gst_video_format_parse_caps(caps, &format, &w, &h)) {
if (filter->silent == FALSE) {
g_print("Unable to get video format from caps\n");
}
return FALSE;
}
isSupported = FALSE;
for (i = 0; i < G_N_ELEMENTS (gst_myfilter_video_format_caps); i++) {
if(gst_caps_can_intersect(caps, gst_static_caps_get(&gst_myfilter_video_format_caps[i]))) {
isSupported = TRUE;
break;
}
}
if(!isSupported) {
if (filter->silent == FALSE) {
g_print("that caps is not supported\n");
}
return FALSE;
}
关于第二个问题,如何测试多种颜色空间和格式支持,解决方案可以是在滤镜之前使用颜色空间转换器和格式说明符,如下所示。
... ! ffmpegcolorspace ! video/x-raw-yuv,format=\(fourcc\)YUY2 | myfilter ! ....