C GTK窗口中的Gstreamer视频

C GTK窗口中的Gstreamer视频,c,gstreamer,gtk3,tegra,C,Gstreamer,Gtk3,Tegra,更新2018.03.12:代码已更新,现在按预期运行 我正在努力创建一个GTK+窗口,相当于下面的gst启动命令 gst-launch-1.0 udpsrc端口=6000 caps=“应用程序/x-rtp”!rtph264depay!h264parse!天哪!自动视频接收器 我的代码如下: int main (int argc, char **argv) { GdkWindow *video_window_xwindow; GtkWidget *window, *video_window

更新2018.03.12:代码已更新,现在按预期运行

我正在努力创建一个GTK+窗口,相当于下面的gst启动命令
gst-launch-1.0 udpsrc端口=6000 caps=“应用程序/x-rtp”!rtph264depay!h264parse!天哪!自动视频接收器

我的代码如下:

int main (int argc, char **argv)
{
  GdkWindow *video_window_xwindow;
  GtkWidget *window, *video_window;
  gulong embed_xid;
  GstStateChangeReturn sret;

  gst_init (&argc, &argv);
  gtk_init (&argc, &argv);

  GstElement *pipeline, *udpsrc, *appxrtp, *depay, *parse, *omxh264dec, *videoConvert, *sink;

  pipeline = gst_pipeline_new ("xvoverlay");
  udpsrc = gst_element_factory_make ("udpsrc", NULL); g_assert(udpsrc);

  //Set CAPS
  g_object_set (G_OBJECT (udpsrc), "port", 6000, NULL);
  GstCaps * xrtpcaps = gst_caps_from_string("application/x-rtp,encoding-name=H264");
  g_object_set (udpsrc, "caps", xrtpcaps, NULL);

  depay = gst_element_factory_make ("rtph264depay", NULL); g_assert(depay);
  parse = gst_element_factory_make ("h264parse", NULL); g_assert(parse);
  omxh264dec = gst_element_factory_make ("omxh264dec", NULL); g_assert(omxh264dec);
  videoConvert = gst_element_factory_make ("videoconvert", NULL); g_assert(videoConvert);
  sink = gst_element_factory_make ("xvimagesink", NULL); g_assert(sink);

  //ADD
  gst_bin_add_many (GST_BIN (pipeline), udpsrc, depay, parse, omxh264dec, videoConvert, sink, NULL);

  //LINK
  g_assert(gst_element_link (udpsrc, depay));
  g_assert(gst_element_link (depay, parse));
  g_assert(gst_element_link (parse, omxh264dec));
  g_assert(gst_element_link (omxh264dec, videoConvert));
  g_assert(gst_element_link (videoConvert, sink));

  /* prepare the ui */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);   

  g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (window_closed), (gpointer) pipeline);
  gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
  gtk_window_set_title (GTK_WINDOW (window), "GstVideoOverlay Gtk+ demo");

  video_window = gtk_drawing_area_new ();
  gtk_container_add (GTK_CONTAINER (window), video_window);
  gtk_container_set_border_width (GTK_CONTAINER (window), 2);

  gtk_widget_show_all (window);

  video_window_xwindow = gtk_widget_get_window (video_window);
  embed_xid = GDK_WINDOW_XID (video_window_xwindow);
  gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), embed_xid);

  /* run the pipeline */
  sret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
  if (sret == GST_STATE_CHANGE_FAILURE)
    gst_element_set_state (pipeline, GST_STATE_NULL);
  else
    gtk_main ();

  gst_object_unref (pipeline);
  return 0;
}
运行它时,我会看到一个黑色/空的GTK窗口。

控制台输出为:

NvMMLiteOpen : Block : BlockType = 261 
TVMR: NvMMLiteTVMRDecBlockOpen: 7907: NvMMLiteBlockOpen 
NvMMLiteBlockCreate : Block : BlockType = 261 
TVMR: cbBeginSequence: 1223: BeginSequence  320x240, bVPR = 0
TVMR: LowCorner Frequency = 100000 
TVMR: cbBeginSequence: 1622: DecodeBuffers = 17, pnvsi->eCodec = 4, codec = 0 
TVMR: cbBeginSequence: 1693: Display Resolution : (320x240) 
TVMR: cbBeginSequence: 1694: Display Aspect Ratio : (320x240) 
TVMR: cbBeginSequence: 1762: ColorFormat : 5 
TVMR: cbBeginSequence:1776 ColorSpace = NvColorSpace_YCbCr601
TVMR: cbBeginSequence: 1904: SurfaceLayout = 3
TVMR: cbBeginSequence: 2005: NumOfSurfaces = 24, InteraceStream = 0, InterlaceEnabled = 0, bSecure = 0, MVC = 0 Semiplanar = 1, bReinit = 1, BitDepthForSurface = 8 LumaBitDepth = 8, ChromaBitDepth = 8, ChromaFormat = 5
TVMR: cbBeginSequence: 2007: BeginSequence  ColorPrimaries = 2, TransferCharacteristics = 2, MatrixCoefficients = 2
Allocating new output: 320x240 (x 24), ThumbnailMode = 0
OPENMAX: HandleNewStreamFormat: 3464: Send OMX_EventPortSettingsChanged : nFrameWidth = 320, nFrameHeight = 240 
我将此作为视频源运行(这似乎很好,我可以在gst发布时使用它,而不会出现任何问题)


谁能给我一些指点吗?我是否需要不同的链接(添加焊盘时)?

omxh264dec接收器之间添加视频转换修复了该问题。视频现在在GTK窗口中渲染。已更新原始代码。

1。您的
videotestsrc
没有
is live=true
。不确定这是否是你想要的。2.您应该在每个IDR帧之前验证是否发送H.264 SPS/PPS。如果不是的话,他们在开始时只收到一次发送,那么如果接收者在发送者之前或之后启动,那就有区别了。嗨,弗洛里安!is line=true是不需要的(我认为),因为我可以通过gst启动来使用这个udpstream。尝试在发送方之前和之后启动接收器,似乎没有什么区别。您应该使用
GST\u DEBUG=3
或更高的值来了解可能的错误。请记住,如果没有
is live=true,视频将以尽可能快的速度生成-可能会溢出UDP链接。
gst-launch-1.0 videotestsrc  ! omxh264enc control-rate=2 bitrate=8000000 ! 'video/x-h264, stream-format=(string)byte-stream' ! h264parse ! rtph264pay mtu=1400 ! udpsink host=127.0.0.1 port=6000