c - Gstreamer-0.10 代码无法通过 udp 传输网络摄像头视频

标签 c streaming video-streaming gstreamer multimedia

操作系统:Ubuntu
Gstreamer 版本 0.10

我必须开发一个应用程序,通过 udp 将视频从网络摄像头传输到远程电脑。 我写了一小段代码,但它运行了一秒钟然后抛出错误。

我得到的错误是

*Running...
Error: Internal data flow error.
Returned, stopping playback
Deleting pipeline*

谁能指出我的错误。
下面是我的代码

GstElement *pipeline, *source, *sink,  *muxer,  *videoenc, *payloader, *udpsink;
  GstBus *bus;
  GMainLoop *loop;
  // Initialize GStreamer
  gst_init (&argc, &argv);

  loop = g_main_loop_new( NULL, FALSE );
  // Create the elements
   source = gst_element_factory_make ("v4l2src", "source");
  muxer = gst_element_factory_make ("qtdemux", "mux");
  // videoenc = gst_element_factory_make("ffdec_mpeg4", "videoenc"); //why this failed
    videoenc = gst_element_factory_make("ffmpegcolorspace", "videoenc");// but this passed but in both cases app failed to run
   payloader = gst_element_factory_make("rtpmp4vpay", "rtpmp4vpay");
   udpsink = gst_element_factory_make("udpsink", "udpsink");

  // Create the empty pipeline
  pipeline = gst_pipeline_new ("test-pipeline");

  if (!pipeline || !source )
  {
    g_printerr ("One element could not be created. Exiting.\n");
    return -1;
  }
  if( !muxer  )
  {
    g_printerr ("failed to create muxer Exiting.\n");
    return -1;
  }
  if( !videoenc)
  {
    g_printerr ("failedto create videoenc. Exiting.\n");
    return -1;
  }

      if( !payloader || !udpsink)
      {
          {
            g_printerr ("One element could not be created out of payloader or udpsink. Exiting.\n");
            return -1;
          }
      }

  g_object_set(G_OBJECT(payloader),
             "config-interval", 0,
             NULL);
  g_object_set(G_OBJECT(udpsink),
              "host", "127.0.0.1",
              "port", 5000,
              NULL);
 // we add a message handler
   bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
   gst_bus_add_watch (bus, bus_call, loop);
   gst_object_unref (bus);


  //set der source
      g_object_set (G_OBJECT ( source ), "device", "/dev/video0", NULL);



          gst_bin_add_many (GST_BIN (pipeline), source,   videoenc, payloader, udpsink, NULL);
              gst_element_link_many (source,  videoenc, payloader, udpsink, NULL);


   // g_print("Linked all the Elements together\n");
      gst_element_set_state (pipeline, GST_STATE_PLAYING);
    // Iterate
      g_print ("Running...\n");
      g_main_loop_run (loop);

      // Out of the main loop, clean up nicely
      g_print ("Returned, stopping playback\n");
      gst_element_set_state (pipeline, GST_STATE_NULL);

      g_print ("Deleting pipeline\n");
      gst_object_unref (GST_OBJECT (pipeline));

}  

最佳答案

评论太长了,我会发布答案,我们会看到我们得到什么。

您一定要使用 0.10 吗?已经有版本 1.6.1.. 在 Ubuntu 15.10 中内置了 1.6.. 无论如何..

我猜你缺少 capsfilter:

GstElement *capsfilter = gst_element_factory_make("capsfilter", "camera_caps");
GstCaps *caps = gst_caps_from_string ("video/x-raw-yuv,format=(fourcc)YUY2,width=1280,height=720,framerate=25/1");
g_object_set (capsfilter, "caps", caps, NULL);

你应该把它放在 v4l2src 元素之后..

如果这不起作用,您可以使用 GST_DEBUG=default:4 调试运行您的应用程序,如果存在链接问题,它应该打印出来。 您还可以生成 dot graph管道并检查是否一切都正确链接..

您可以通过重写 gst-launch shell 命令中的代码来加快调试速度:

GST_DEBUG=3 gst-launch-0.10 v4l2src device=/dev/video0 ! video/x-raw-yuv,format=\(fourcc\)YUY2,width=1280,height=720,framerate=25/1 ! ffmpeg 色彩空间! rtpmp4vpay !队列 ! udpsink 端口=5000 主机=127.0.0.1

关于c - Gstreamer-0.10 代码无法通过 udp 传输网络摄像头视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34079001/

相关文章:

C stat() 忽略文件

python - gdal-python 中的 ReadAsArray 与 C-GDAL 中的 GDALRasterIO 相同吗?

audio - 哪些工具可用于构建自定义媒体播放器?

无需快速时间的 iPhone M3U 音频流

video - 如何存储和流式传输私有(private)视频内容

c++ - 如何以可移植的方式检查文件是否存在于 C++ 中?

c - VS2013中输出屏幕突然闪烁并消失?

android - 创建一个简单的 ExoPlayer 实例

android - 需要首先通过缓冲而不下载完整视频来在 videoview 中播放视频。有这方面的图书馆吗?

ffmpeg - 转码流的 MIME 类型