GStreamer。如何更改v4l2src图像分辨率?

问题描述 投票:0回答:1

有管道:

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);
}

我真的不知道该怎么做。请帮助我)

c++ gstreamer multimedia
1个回答
0
投票

你的问题有几个要点。您可以使用 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
© www.soinside.com 2019 - 2024. All rights reserved.