小编dev*_*slo的帖子

如何在自定义xy位置启动gst-launch

我正在使用embedded-linux开发一个C++应用程序,我需要在其中显示来自摄像头的视频.我使用gstreamer来创建一个窗口并开始视频捕获(因为它在tegra上有硬件支持),带有命令:

system("gst-launch -e v4l2src device=\"/dev/video0\" \
              ! \"video/x-raw-yuv,width=320,height=240\" \
              ! videoflip method=counterclockwise \
              ! nvvidconv \
              ! nvxvimagesink &")
Run Code Online (Sandbox Code Playgroud)

设备上的主要应用程序是全屏运行的,因此我需要将此窗口放在屏幕上的特定位置,这样用户就会感觉它在同一个"窗口"中运行.我设法做到这一点:

XMoveWindow(display, win_video, x, y);  // x, y from top left point in landscape mode!
Run Code Online (Sandbox Code Playgroud)

我面临的问题是gst-launch首先显示在0,0坐标上(因为它是从命令行运行的),然后在应用程序中以正确的位置(以编程方式)"捕捉".我这样做是通过运行XQueryTree来搜索所有显示的窗口并找到具有gst-launch的窗口然后移动它.这需要一些时间并且看起来不太好,所以我正在寻找更好的解决方案.

我已经尝试在gst-launch管道中使用视频文件将视频定位在屏幕上,但问题是它从0,0绘制了一个黑色边框到视频窗口(border-alpha = 0应该解决这个问题,但是它没有 - 我认为问题出在nvvidconv或nvxvimagesink中,但我无法知道):

gst-launch -e v4l2src device="/dev/video0" ! "video/x-raw-yuv,width=320,height=240" ! videobox border-alpha=0 top=-50 left=-50 ! nvvidconv ! nvxvimagesink
Run Code Online (Sandbox Code Playgroud)

第二个解决方案是我将主应用程序窗口设置为始终在顶部,在找到视频窗口后,将其移动到位置,然后将主应用程序恢复正常并将视频窗口移到顶部.我已经尝试了两种方法,我在这里设置始终在顶部,但两者都不起作用.第一:

Status x11_window_set_on_top (Display* display, Window xid)
{
  XEvent event;
  event.xclient.type = ClientMessage;
  event.xclient.serial = 0;
  event.xclient.send_event = True;
  event.xclient.display = display;
  event.xclient.window  = xid; …
Run Code Online (Sandbox Code Playgroud)

c++ xlib gstreamer embedded-linux tegra

5
推荐指数
0
解决办法
1117
查看次数

标签 统计

c++ ×1

embedded-linux ×1

gstreamer ×1

tegra ×1

xlib ×1