我正在尝试在特定屏幕上显示视频流。 现在我使用具有
waylandsink
和 display
属性的 fullscreen
,所以我有:
gst-launch-1.0 videotestsrc ! waylandsink display=wayland-0 fullscreen=TRUE
效果很好。 然后我使用
xrandr --listmonitors
检查我的显示列表,我得到:
Monitors: 2
+*XWAYLAND0 1920/508x1080/286+0+0 XWAYLAND0
+XWAYLAND1 1920/508x1080/286+1920+0 XWAYLAND1
所以我尝试用
wayland-0
替换 wayland-1
但管道停止了。
我不确定我的显示名称是否正确,或者我应该如何获取它(目前我使用了 wayland-0
并简单地增加了它)。或者是否可以使用 waylandsink
来做到这一点
编辑: 我做了更多研究(但仍然不够)。首先我意识到 Waylandsink 可能不是我要找的。其次,我不明白 Linux 中的渲染工作原理(而且还不是很清楚)。
但我发现:
我会继续寻找...
我终于找到了!这是
kmssink
,但我会解释更多原因。
首先我谈到了
waylandsink
。问题是我不知道 wayland 是一个协议,它似乎只适用于在桌面环境 (DE) 内显示内容。所以我想你可以为每个显示器创建窗口,然后将你的接收器链接到这些窗口。但我一直在寻找一种无需任何 DE 即可显示的方法,因此 waylandsink
不是一个选项。
对于
glimagesink
,从我的尝试来看,它也在DE中,所以我没有进一步探索它。
然后是使用
fbdevsink
的帧缓冲区。它可以在没有 DE 的情况下工作,但受到限制... /dev/fb0
中似乎只有一个帧缓冲区,无论显示分辨率如何,我们在其中绘制的内容都会显示在每个屏幕上。因此,如果我们有两台分辨率不同的显示器,我们就无法在不对其中一台显示器进行一些裁剪的情况下实现全屏显示。另外,我们无法在每个屏幕上显示不同的视频,因为帧缓冲区是重复的。最后,当我测试它时,我发现有时有些帧同时绘制到帧缓冲区中,因此导致视频出现一些奇怪的视觉效果。
也许我列出的问题可以通过某种方式解决,但问题太多了,所以我放弃了这个选项
当我检查
kmssink
的文档时,它说有 2 个我感兴趣的主要参数:
通过指定
bus-id
我虽然可以在特定屏幕上显示。但所有显示器都使用相同的总线 ID:0000:00:02.0
,因此它不是指定显示器的参数。
然后是
connector-id
。它是一个整数,可用于指定显示。就我而言,它是 77
代表 HDMI-A-1
,92
代表 HDMI-A-2
。
如何获得
connector-id
?嗯,这并不简单...
有一个命令可以获取它们,它被称为 modetest
。问题是它似乎只包含在某些嵌入式设备中。我发现该命令包含在包中 libdrm
但就我而言,安装它并没有让我访问该命令......
我将 GStreamer 与 Rust 结合使用,因此通过导入 drm 包,我能够获取连接器 ID 列表以及大量有关显示器的数据。
所以最后我能做到:
gst-launch-1.0 videotestsrc ! kmssink connector-id=77
或:
gst-launch-1.0 videotestsrc ! kmssink connector-id=92
显示在我想要的屏幕上。 最后一件事:kmssink 需要以 root 身份执行才能工作
获取与 kmssink 一起使用的连接器 ID,如 Yuutsuna 的答案中所述,如下所示:
首先安装drm-info包(在Ubuntu 22.04上测试):
sudo apt install drm-info
或(Ubuntu 20.04)
sudo snap install drm-info
然后运行命令(从apt安装):
drm_info
或者如果从 snap 安装:
drm-info
输出可能如下所示。查找“连接器”部分以查找您感兴趣的端口。您的端口的对象 ID 是连接器 ID。
drmModeGetResources: Operation not supported
Node: /dev/dri/card0
├───Driver: rockchip (RockChip Soc DRM) version 3.0.0 (20140818)
│ ├───DRM_CLIENT_CAP_STEREO_3D supported
│ ├───DRM_CLIENT_CAP_UNIVERSAL_PLANES supported
│ ├───DRM_CLIENT_CAP_ATOMIC supported
│ ├───DRM_CLIENT_CAP_ASPECT_RATIO supported
│ ├───DRM_CLIENT_CAP_WRITEBACK_CONNECTORS supported
│ ├───DRM_CAP_DUMB_BUFFER = 1
│ ├───DRM_CAP_VBLANK_HIGH_CRTC = 1
│ ├───DRM_CAP_DUMB_PREFERRED_DEPTH = 0
│ ├───DRM_CAP_DUMB_PREFER_SHADOW = 0
│ ├───DRM_CAP_PRIME = 3
│ ├───DRM_CAP_TIMESTAMP_MONOTONIC = 1
│ ├───DRM_CAP_ASYNC_PAGE_FLIP = 1
│ ├───DRM_CAP_CURSOR_WIDTH = 64
│ ├───DRM_CAP_CURSOR_HEIGHT = 64
│ ├───DRM_CAP_ADDFB2_MODIFIERS = 1
│ ├───DRM_CAP_PAGE_FLIP_TARGET = 0
│ ├───DRM_CAP_CRTC_IN_VBLANK_EVENT = 1
│ ├───DRM_CAP_SYNCOBJ = 0
│ └───DRM_CAP_SYNCOBJ_TIMELINE = 0
├───Device: platform rockchip,display-subsystem
├───Framebuffer size
│ ├───Width: [0, 16384]
│ └───Height: [0, 16384]
├───Connectors
│ ├───Connector 0
│ │ ├───Object ID: 206 **************connector-id**************
│ │ ├───Type: writeback
│ │ ├───Status: connected
│ │ ├───Physical size: 0x0 mm
│ │ ├───Subpixel: unknown
│ │ ├───Encoders: {0}
│ │ ├───Modes
│ │ │ ├───[email protected] preferred driver
│ │ │ └───[email protected] preferred driver
│ │ └───Properties
│ │ ├───"DPMS": enum {On, Standby, Suspend, Off} = On
│ │ ├───"link-status": enum {Good, Bad} = Good
│ │ ├───"non-desktop" (immutable): range [0, 1] = 0
│ │ ├───"TILE" (immutable): blob = 0
│ │ ├───"CRTC_ID" (atomic): object CRTC = 0
│ │ ├───"WRITEBACK_OUT_FENCE_PTR" (atomic): range [0, UINT64_MAX] = 0
│ │ ├───"WRITEBACK_FB_ID" (atomic): object framebuffer = 0
│ │ ├───"WRITEBACK_PIXEL_FORMATS" (atomic, immutable): blob = 204
│ │ │ ├───BGR888 (0x34324742)
│ │ │ ├───ARGB8888 (0x34325241)
│ │ │ ├───RGB565 (0x36314752)
│ │ │ └───NV12 (0x3231564e)
│ │ ├───"brightness": range [0, 100] = 50
│ │ ├───"contrast": range [0, 100] = 50
│ │ ├───"saturation": range [0, 100] = 50
│ │ └───"hue": range [0, 100] = 50
│ ├───Connector 1
│ │ ├───Object ID: 208 **************connector-id**************
│ │ ├───Type: HDMI-A
│ │ ├───Status: connected
│ │ ├───Physical size: 1600x900 mm
│ │ ├───Subpixel: unknown
│ │ ├───Encoders: {1}
│ │ ├───Modes
│ │ │ ├───[email protected] driver phsync pvsync
│ │ │ ├───[email protected] driver phsync pvsync 16:9
│ │ │ ├───[email protected] driver phsync pvsync interlace
│ │ │ ├───[email protected] driver phsync pvsync interlace 16:9
│ │ │ ├───[email protected] driver phsync pvsync 16:9
│ │ │ ├───[email protected] driver phsync pvsync 16:9
│ │ │ ├───[email protected] driver phsync pvsync
│ │ │ ├───[email protected] driver phsync pvsync 16:9
│ │ │ ├───[email protected] driver nhsync nvsync
│ │ │ ├───[email protected] driver nhsync nvsync 16:9
│ │ │ └───[email protected] driver nhsync nvsync 4:3
│ │ └───Properties
│ │ ├───"EDID" (immutable): blob = 299
│ │ ├───"DPMS": enum {On, Standby, Suspend, Off} = Off
│ │ ├───"link-status": enum {Good, Bad} = Good
│ │ ├───"non-desktop" (immutable): range [0, 1] = 0
│ │ ├───"TILE" (immutable): blob = 0
│ │ ├───"CRTC_ID" (atomic): object CRTC = 0
│ │ ├───"color_depth": enum {Automatic, 24bit, 30bit} = 24bit
│ │ ├───"color_format": enum {rgb, ycbcr444, ycbcr422, ycbcr420, ycbcr_high_subsampling, ycbcr_low_subsampling, invalid_output} = ycbcr444
│ │ ├───"color_depth_caps": range [0, UINT8_MAX] = 1
│ │ ├───"color_format_caps": range [0, 15] = 7
│ │ ├───"HDR_PANEL_METADATA" (immutable): blob = 297
│ │ ├───"NEXT_HDR_SINK_DATA" (immutable): blob = 0
│ │ ├───"allm_capacity": range [0, 1] = 0
│ │ ├───"allm_enable": enum {disable, enable} = disable
│ │ ├───"output_hdmi_dvi": enum {auto, force_hdmi, force_dvi} = auto
│ │ ├───"output_type_capacity": enum {DVI, HDMI} = HDMI
│ │ ├───"HDR_OUTPUT_METADATA": blob = 0
│ │ ├───"Colorspace": enum {Default, SMPTE_170M_YCC, BT709_YCC, XVYCC_601, XVYCC_709, SYCC_601, opYCC_601, opRGB, BT2020_CYCC, BT2020_RGB, BT2020_YCC, DCI-P3_RGB_D65, DCI-P3_RGB_Theater} = Default
│ │ ├───"CONNECTOR_ID" (atomic, immutable): range [0, 15] = 0
│ │ ├───"Content Protection": enum {Undesired, Desired, Enabled} = Undesired
│ │ ├───"HDCP Content Type": enum {HDCP Type0, HDCP Type1} = HDCP Type0
│ │ ├───"hdcp_encrypted": range [0, 2] = 0
│ │ ├───"brightness": range [0, 100] = 50
│ │ ├───"contrast": range [0, 100] = 50
│ │ ├───"saturation": range [0, 100] = 50
│ │ └───"hue": range [0, 100] = 50
│ ├───Connector 2
│ │ ├───Object ID: 224 **************connector-id**************
│ │ ├───Type: HDMI-A
│ │ ├───Status: connected
│ │ ├───Physical size: 480x260 mm
│ │ ├───Subpixel: unknown
│ │ ├───Encoders: {2}
│ │ ├───Modes
│ │ │ ├───[email protected] preferred driver phsync pvsync
│ │ │ ├───[email protected] driver phsync pvsync 16:9
│ │ │ ├───[email protected] driver phsync pvsync
│ │ │ ├───[email protected] driver phsync pvsync 16:9
│ │ │ ├───[email protected] driver phsync pvsync
│ │ │ ├───[email protected] driver phsync pvsync
│ │ │ ├───[email protected] driver phsync pvsync
│ │ │ ├───[email protected] driver phsync pvsync 16:9
│ │ │ ├───[email protected] driver phsync pvsync
│ │ │ └───[email protected] driver phsync pvsync 16:9
│ │ └───Properties
│ │ ├───"EDID" (immutable): blob = 301
│ │ ├───"DPMS": enum {On, Standby, Suspend, Off} = On
│ │ ├───"link-status": enum {Good, Bad} = Good
│ │ ├───"non-desktop" (immutable): range [0, 1] = 0
│ │ ├───"TILE" (immutable): blob = 0
│ │ ├───"CRTC_ID" (atomic): object CRTC = 121
│ │ ├───"color_depth": enum {Automatic, 24bit, 30bit} = 24bit
│ │ ├───"color_format": enum {rgb, ycbcr444, ycbcr422, ycbcr420, ycbcr_high_subsampling, ycbcr_low_subsampling, invalid_output} = ycbcr444
│ │ ├───"color_depth_caps": range [0, UINT8_MAX] = 1
│ │ ├───"color_format_caps": range [0, 15] = 7
│ │ ├───"HDR_PANEL_METADATA" (immutable): blob = 264
│ │ ├───"NEXT_HDR_SINK_DATA" (immutable): blob = 0
│ │ ├───"allm_capacity": range [0, 1] = 0
│ │ ├───"allm_enable": enum {disable, enable} = disable
│ │ ├───"output_hdmi_dvi": enum {auto, force_hdmi, force_dvi} = auto
│ │ ├───"output_type_capacity": enum {DVI, HDMI} = HDMI
│ │ ├───"HDR_OUTPUT_METADATA": blob = 0
│ │ ├───"Colorspace": enum {Default, SMPTE_170M_YCC, BT709_YCC, XVYCC_601, XVYCC_709, SYCC_601, opYCC_601, opRGB, BT2020_CYCC, BT2020_RGB, BT2020_YCC, DCI-P3_RGB_D65, DCI-P3_RGB_Theater} = Default
│ │ ├───"CONNECTOR_ID" (atomic, immutable): range [0, 15] = 1
│ │ ├───"Content Protection": enum {Undesired, Desired, Enabled} = Undesired
│ │ ├───"HDCP Content Type": enum {HDCP Type0, HDCP Type1} = HDCP Type0
│ │ ├───"hdcp_encrypted": range [0, 2] = 0
│ │ ├───"brightness": range [0, 100] = 50
│ │ ├───"contrast": range [0, 100] = 50
│ │ ├───"saturation": range [0, 100] = 50
│ │ └───"hue": range [0, 100] = 50