【视频开发】用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可能帮到大家)
【视频开发】用GStreamer实现摄像头的采集和保存的更多相关文章
- 【视频开发】Gstreamer中一些gst-launch常用命令
GStreamer是著名的开源多媒体框架,功能强大,其命令行程序 gst-launch 可以实现很多常规测试.播放等,作为系统调试等是非常方便的. 1.摄像头测试 gst-launch v4l2src ...
- 【ARM-Linux开发】Gstreamer+QT+摄像头 编程总结
1,gstreamer开发手册,gstreamer官网(这些都不用说了吧) 2,gst-launch的用法,这也不用说了吧.(白菜,鸡蛋,西红柿,砖头,鼠标--..) 3,http://blog.ch ...
- 【视频开发】Gstreamer框架中使用gst-launch进行流媒体播放
Gstreamer框架中使用gst-launch进行流媒体播放 Gstreamer是一套开源的流媒体框架,用其也可以进行流媒体开发,Gstreamer是基于glib库编写的,需要将多个不同功能的元件( ...
- Android 音视频开发(四):使用 Camera API 采集视频数据
本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...
- Android 音视频开发学习思路
Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...
- Android 音视频开发(七): 音视频录制流程总结
在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...
- [转]GStreamer资料(摄像头采集,视频保存,远程监控)DVR
http://blog.csdn.net/wzwxiaozheng/archive/2010/12/26/6099397.aspx GStreamer资料整理(包括摄像头采集,视频保存,远程监控,流媒 ...
- Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
随机推荐
- SpringBoot——报错总结
前言 记录SpringBoot的相关报错信息 错误 无法引入@ResponseBody和@RequestMapping("/") <dependency> <gr ...
- iis站点设置错误页面返回http状态码为404而不是302或其他
今天一位客户说网站错误页面返回的状态码是302而不是404,问ytkah要如何处理.这个应该是设置没有正确的原因.我们一步步来排查一下.1.首先打开iis管理器,左侧选择具体的站点,在右侧窗口中点击4 ...
- node 文件上传
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 【HTTP】另类的POST头数据 RFC1867协议格式简析
http://blog.csdn.net/ai2000ai/article/details/52161979 昨天在实战表单模拟提交的时候,有发现在提交某个表单的时候,页面(discuz!论坛)报错, ...
- python--模块学习之xml模块
xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 本文主要学习的ElementTree是python的XML处理模块,它提供了一个轻量级的对象 ...
- (尚029)Vue_案例_交互footer组件功能
需要实现界面截图: 难点分析:sAllCheck必须定义为计算属性 1.想到问题: 一旦写一个组件,需要接收哪些属性?? 因为只有属性确定了,标签才好写 todos属性可以确定三个方面的显示 2.做交 ...
- 5-微信小程序开发(小程序页面跳转和布局说明)
https://www.cnblogs.com/yangfengwu/p/11605209.html 新建一个小程序 咱现在新建个页面 在pages 上右击,选择新建目录 会自动添加这几个文件 现在做 ...
- 洛谷P4170 [CQOI2007]涂色题解
废话: 这个题我第一眼看就是贪心呐, 可能是我之前那做过一道类似的题这俩题都是关于染色的 现在由于我帅气无比的学长的指导, 我已经豁然开朗, 这题贪心不对啊, 当时感觉自己好厉害贪心都能想出来 差点就 ...
- 洛谷P1084 运输计划
题目 题目要求使一条边边权为0时,m条路径的长度最大值的最小值. 考虑二分此长度最大值 首先需要用lca求出树上两点间的路径长度.然后取所有比mid大的路径的交集,判断有哪些边在这些路径上都有出现,然 ...
- ubuntu笔记1-vim安装报错
ubuntu安装vim的时候,报错提示:vim : 依赖: vim-common (= 2:7.3.429-2ubuntu2) 但是 2:7.3.429-2ubuntu2.1 正要被安装 说明既存的v ...