有管道:
v4l2src ! decodebin ! queue ! videoconvert ! xvimagesink
启动后
v4l2src
发现许多具有媒体类型image/jpeg
和不同图像分辨率的大写字母。 v4l2src
选择第一个 1920x1080 的大写字母。我想要 320x240。而且我真的不明白如何设置这个分辨率。
好的,我能做到:
v4l2src ! image/jpeg,width=320,height=240 ! decodebin ! queue ! videoconvert ! xvimagesink
v4l2src ! jpegdec ! video/x-raw,width=320,height=240 ! queue ! videoconvert ! xvimagesink
但这并不通用。如果网络摄像头有不同的格式怎么办?
例如,此时我在虚拟机上工作,虚拟网络摄像头只有
image/jpeg
,但在本机系统上网络摄像头也有 video/x-raw
。 video/x-raw
是第一个可用的集合。video/x-h264
或其他内容怎么办?
我是否正确理解 GStreamer 不具备以某种方式通用设置图像分辨率的能力?
v4l2src ! <all-media-type>,width=320,height=240 ! decodebin ! queue ! videoconvert ! xvimagesink
我尝试做什么?
在
gst-inspect-1.0
中我发现v4l2src
有信号prepare-format
。好吧,如果在 capsfilter
和 v4l2src
之间添加 decodebin
会怎么样?当 prepare-format-callback
调用时,我将获取媒体类型并将上限设置为 capsfilter
,希望管道能够以某种方式神奇地更新)
void onV4l2Prepare(GstElement *src, gint /*arg0*/, GstCaps *arg1, GstElement *pipeline_)
{
GstStructure *structure = gst_caps_get_structure(arg1, 0);
const gchar *media_type = gst_structure_get_name(structure);
GstElement *capsfilter = gst_bin_get_by_name(GST_BIN(pipeline_), "capsfilter");
GString *caps_str = g_string_new(nullptr);
g_string_printf(caps_str, "%s,width=320,height=240", media_type, NULL);
g_object_set(G_OBJECT(capsfilter), "caps", caps_str, NULL);
g_string_free(caps_str, TRUE);
// want to check update
GstPad *pad = gst_element_get_static_pad(src, "src");
GstCaps *caps = gst_pad_get_current_caps(pad);
gchar *str = gst_caps_to_string(caps);
g_print(str, NULL); // no updates
g_free(str);
gst_caps_unref(caps);
gst_object_unref(pad);
}
我真的不知道该怎么做。请帮助我)
你的问题有几个要点。您可以使用 videoscale 重新缩放到给定的分辨率。要根据收到的上限管理不同的路径,您可以使用 switchbin。 尝试:
gst-launch-1.0 -v v4l2src device=/dev/video0 ! switchbin num-paths=4 \
path0::caps="video/x-raw" path0::element="videoconvert" \
path1::caps="image/jpeg" path1::element="jpegdec ! videoconvert" \
path2::caps="video/x-h264" path2::element="h264parse ! avdec_h264 ! videoconvert" \
path3::caps="ANY" path3::element="fakesink videotestsrc ! videoconvert" \
! videoscale ! video/x-raw,width=320,height=240,pixel-aspect-ratio=1/1 ! autovideosink