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可能帮到大家)

【视频开发】用GStreamer实现摄像头的采集和保存的更多相关文章

  1. 【视频开发】Gstreamer中一些gst-launch常用命令

    GStreamer是著名的开源多媒体框架,功能强大,其命令行程序 gst-launch 可以实现很多常规测试.播放等,作为系统调试等是非常方便的. 1.摄像头测试 gst-launch v4l2src ...

  2. 【ARM-Linux开发】Gstreamer+QT+摄像头 编程总结

    1,gstreamer开发手册,gstreamer官网(这些都不用说了吧) 2,gst-launch的用法,这也不用说了吧.(白菜,鸡蛋,西红柿,砖头,鼠标--..) 3,http://blog.ch ...

  3. 【视频开发】Gstreamer框架中使用gst-launch进行流媒体播放

    Gstreamer框架中使用gst-launch进行流媒体播放 Gstreamer是一套开源的流媒体框架,用其也可以进行流媒体开发,Gstreamer是基于glib库编写的,需要将多个不同功能的元件( ...

  4. Android 音视频开发(四):使用 Camera API 采集视频数据

    本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...

  5. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  6. Android 音视频开发(七): 音视频录制流程总结

    在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...

  7. [转]GStreamer资料(摄像头采集,视频保存,远程监控)DVR

    http://blog.csdn.net/wzwxiaozheng/archive/2010/12/26/6099397.aspx GStreamer资料整理(包括摄像头采集,视频保存,远程监控,流媒 ...

  8. Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  9. Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

随机推荐

  1. 设置web应用的 context root (转)-- web project setting

    context root确定了Tomcat将那些URL请求转发到Web应用. 如果应用的context root 设置为 myapp,除非存在更为明确context root的Web应用,那么所有 / ...

  2. 浏览器渲染详细过程:重绘、重排和 composite 只是冰山一角

    https://juejin.im/entry/590801780ce46300617c89b8 渲染 这张很经典的图许多人都看过,其中的概念大家应该都很熟悉,也就是这么几个步骤:js修改dom结构或 ...

  3. hdu4027-Can you answer these queries? -(线段树+剪枝)

    题意:给n个数,m个操作,分两种操作,一种是将一段区间的每个数都开根号,另一种是查询区间和. 解题:显然对每个数开根号不能用lazy的区间更新.一个一个更新必然爆时间,对1开根号还是1,如果一段区间都 ...

  4. (10)树莓派 vim编辑器使用

    进去后 1点击 insert 插入数据 2 ctrl+alt+c  粘贴内容 或者 手动敲入代码 3 ctrl+v     保存 4 :wq  保存退出 5 回车

  5. Tasking

    Put your plan on the tick list, and set the completion time limit, daily repetition, etc. according ...

  6. cortex 基本试用

    cortext是prometheus的多租户解决方案,目前在cncf 沙箱孵化,以下是一个简单的试用 注意因为golang 包的问题,而且以下依赖的几个项目都是基于go module 的所以使用了go ...

  7. JS稀奇古怪题目

    JS稀奇古怪题目: 1.操作对象属性优先级高于普通赋值操作 var a = { n: 1 }; var b = a; //操作对象属性优先级高于普通赋值操作 a.x = a = { n: 2 }; c ...

  8. [Java] key

    Z2VueW1vJTIwJTI2JTI2JTI2JTIwMTYzJTNBJTBBdXNyJTIwLSUyMHd1a29uZ3N1bjEyMzQlMjAlMjMlMjAxNjMuc3VmZml4JTIw ...

  9. C++中vector的使用总结

    vector简单说明 vector也是一个容器,并且是个顺序容器.顺序容器有可变长数组vector.双向链表list.双端队列deque. 顺序容器的定义,是因为容器元素的位置和他们的值大小无关,也就 ...

  10. itext7 html转pdf实现

    公司最近做一个交易所项目,里面涉及一个需求就是将html模板,在填充数据后转换为pdf,这样防止数据更改,下面是具体实现 1 pom文件 <dependency> <groupId& ...