• 【视频开发】用GStreamer实现摄像头的采集和保存


    GStreamer是流媒体软件的开发框架。可以这样说,在该框架的支持下,你可以非常简单地为很多格式的流媒体写出自已需要的程序。
    现在,GStreamer已经内置对MP3、Ogg/Vorbis、MPEG-1/2、AVI、Quicktime、mod等媒体格式的支持,如果你需要开发此类软件,你可以直接为我所用。如果你程序需要用到GStreamer未包含的格式,你可以通过开发相应的插件来达到你的目的。
    GStreamer及其自带的插件支持GNU LGPL协议。具体信息请参阅源代码所附的相关说明文档。

     

    转入正题:

    利用GST可以方便的实现对摄像头的采集并显示,再加QT做个漂亮的界面就可以实现一个集采集,显示,拍照….等功能于一体的软件了。当然,大部分功能都是以GST为基础的,QT只是个漂亮的外套。下面先来一个GST的元件连接图吧。

     

    v4l2src -> ffmpegcolorspace ->tee -> queue1 -> ximagesink

                                                       |

                                                       |--->queue2->videorate->video_filter->x264enc-> avimux -> filesink

     

     

    1, 首先把上面的插件用gst_element_factory_make()创建出来

    2, 如果创建没问题的话,再gst_bin_add()到创建的pipeline中。(什么?上面的图中没有pipeline,哥们,别搞笑了吧)。

     

    3, 下面就是经常出问题的gst_element_link了。这个是该重点讲一下的。其实gst_element_link函数一般不会出问题的,问题是连起来的插件不起作用,或者出一些BUG,这个才是真正头疼的。

    而重点除了要正确的使用元件,还要正确的设置元件的属性。

     

      首先对输入源v4l2src的device属性设置一下,指定采集设备的名称:

      g_object_set(G_OBJECT(v4l2src),"device", device_filename, NULL);

     

      设置保存文件的的文件路径。

      g_object_set(G_OBJECT(filesink),"location", video_filename, NULL);

     

         对tee和queue1,queue2连接的时候,不妨使用下面的代码,只列出对queue1的例子: 

          GstPad *tee_pad =gst_element_get_request_pad (tee, "src%d");

          GstPad *sink_pad =gst_element_get_static_pad (queue1, "sink");

        gst_pad_link (tee_pad, sink_pad);

        这样连接后,就不需要再用gst_element_link来连接了。

     

        还有一点要说明的是,要把queue的属性设置一下,两个都要设置,下面只列出第一个:

          g_object_set(G_OBJECT (queue1),"max-size-buffers", 0, NULL);

          g_object_set(G_OBJECT(queue1), "max-size-time", 0, NULL);

          g_object_set(G_OBJECT(queue1), "max-size-bytes", 512000000, NULL);

     

    4, 经过上面的设置,元件似乎可以连接起来了,让我们来一串gst_element_link(),或者用个比较直接的gst_element_link_many();

    5, 设置pipeline的状态为PLAYING:

     gst_element_set_state(pipeline,GST_STATE_PLAYING);

     要注意的是,这个设置不一定会成功可能会返回GST_STATE_CHANGE_FAILURE。

     不要紧张,不妨再调用 一次gst_element_set_state(pipeline,GST_STATE_PLAYING);

     如果不行的话,就再来一次,要是还不行的话,就检查元件的使用或者属性设置是不是错了。因为本文仅供参考,只能提供一个可能的解决办法,所以并不保证以上元件在所有机器上连接起来都能工作,毕竟本人学GST的时间也不长。

     

    下面再强调一下其它的几个小问题:

    1,用过gst的都知道使用ximagesink或xvimagesink可以出现一个显示图像的窗口,怎样将这个窗口依附到我们漂亮的QT界面上呢?

    gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(videosink), m_winID);

    不妨试一下上面这个函数。

     

    2,Ximagesink和xvimagesink ,本文使用的是ximagesink,因为使用ximagesink可以截图。使用xvimagesink的时候截图出现的是一片无望的黑色。(要问怎么截图,大家就去翻翻QT的东东吧,当然QPixmap::grabWindow和QImage.save可能帮到大家)

  • 相关阅读:
    vc++6.0如何调试
    Visual C++单文档混合分割视图
    使用VC6.0实现窗口的任意分割张中庆
    用MFC创建通用窗体分割框架
    vc++6.0编译环境介绍(1、2)
    浅谈SDI单文档多视切换方法
    单文档多视图Formview切换源代码(此网还有许多其它多视图切换的源代码)
    VC单文档实现多视图的方法
    Visual C++(VC++6.0)编译器常用选项设置
    PowerTip of the DayRemoving Empty Things
  • 原文地址:https://www.cnblogs.com/huty/p/8517018.html
Copyright © 2020-2023  润新知