http://gstreamer.freedesktop.org/src/

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/qt-gstreamer/html/index.html

网络上关于QtGstreamer的教程不多,所以只好从源码入手。这是我自己总结的一个小方法,一般使用这些开源的库,如果没有大公司做维护支持,常常会发现文档写的不完备。有时候甚至连最基本的API都找不到。然而在它的源码包中常常会有一个名为test或example的文件夹,里面会有一些非常简单的例子。例子的代码一般较为短小精炼,只要读懂了这个例子,就能够明白主要API的含义了。

先用zypper在meego上装好QtGstreamer(注意要更新到meego1.2版本,之前的版本没有收录QtGstreamer)。查看其版本信息,为0.10.1-1.70。在Gstreamer官网上找到对应的版本的源码(或者直接用yumdownloader下载源中的源码,但是有可能不完整),下载解压。之所以要找同样版本号的原因是防止Gstreamer在更新中有API的变更。

如预期在源码中找到一个名为player的例子与一个recoder的例子。阅读源码,编译,运行,感觉player已经基本可以满足我们的需求,由于其使用的是Gstreamer中的playbin2来搭建pipeline,所以对于格式的支持我们不用过多考虑。为了支持的完备,出了zypper自己带的Gstreamer plugin之外,需要自己把同等版本的ffmpeg plugin包以及ugly plugin包装上。方法也是先查看本机其他plugin的版本,再去Gstreamer官网找相应版本,下载,编译,安装。

从这个例子还可以看出来,使用QtGstreamer的方法很简单,首先聚合一个QGst::Ui::VideoWidget。这是一个QtWidget,可以作为普通的组件在Qt界面显示,另一方面,它可以绑定一个普通的sink,例如屏幕上的xvideosink,这样pipeline播放的结果就会显示在这个组件里,而不是其他的窗口。从官方文档(http://gstreamer.freedesktop.org/data/doc/gstreamer/head/qt-gstreamer/html/classQGst_1_1Ui_1_1VideoWidget.html)可以看到,绑定的方法有两种,

  1. void    setVideoSink (const ElementPtr &sink)
  2. void    watchPipeline (const PipelinePtr &pipeline)

对应的释放方法为:

  1. void    releaseVideoSink ()
  2. void    stopPipelineWatch ()

除了player这个例子之外还有一个叫做recorder的例子,界面过于简单,不能预览,使用不便,所以要重新写一个简单的recorder。recorder的pipeline自然不能用playbin2来搭建。在例子用到的pipeline是:
audiosrc ! audioconvert ! audioresample ! audiorate ! speexenc ! queue !
                                                                                                                                   oggmux ! filesink
autovideosrc ! ffmpegcolorspace ! theoraenc ! queue !
由于需要一个预览的功能,我们把做两种结构的pipeline,一个工作在预览状态,一个工作在录制状态,状态切换的时候改变pipeline的结构。
预览状态的pipeline为:
autovideosrc ! queue ! xvimagesink

录制的pipeline为:

queue ! xvimagesink
autovideosrc ! tee !
                                   queue ! ffmpegcolorspace ! theoraenc ! oggmux ! filesink
可以看到没有录音了,对的,先不用管声音了。当然也可以加上。

player的源代码在QtGstreamer源码的例子里面会有,我们不改动。Recorder的源码贴在下面:

    1. #include "recorder.h"
    2. #include <QGst/ElementFactory>
    3. Recorder::Recorder(QWidget *parent)
    4. : QGst::Ui::VideoWidget(parent)
    5. {
    6. camera_src = QGst::ElementFactory::make("autovideosrc");
    7. tee = QGst::ElementFactory::make("tee");
    8. queue0 = QGst::ElementFactory::make("queue");
    9. queue1 = QGst::ElementFactory::make("queue");
    10. ffmpegcolorspace = QGst::ElementFactory::make("ffmpegcolorspace");
    11. theoraenc = QGst::ElementFactory::make("theoraenc");
    12. oggmux = QGst::ElementFactory::make("oggmux");
    13. filesink = QGst::ElementFactory::make("filesink");
    14. x_sink = QGst::ElementFactory::make("xvimagesink");
    15. m_pipeline = QGst::Pipeline::create();
    16. m_pipeline->add(camera_src, tee, queue0, x_sink, queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);
    17. camera_src->link(tee);
    18. QGst::Element::linkMany(tee, queue0, x_sink);
    19. QGst::Element::linkMany(tee, queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);
    20. }
    21. Recorder::~Recorder()
    22. {
    23. if (m_pipeline) {
    24. m_pipeline->setState(QGst::StateNull);
    25. releaseVideoSink();
    26. }
    27. }
    28. void Recorder::preview()
    29. {
    30. m_pipeline->setState(QGst::StateNull);
    31. releaseVideoSink();
    32. m_pipeline->remove(queue1);
    33. m_pipeline->remove(ffmpegcolorspace);
    34. m_pipeline->remove(theoraenc);
    35. m_pipeline->remove(oggmux);
    36. m_pipeline->remove(filesink);
    37. setVideoSink(x_sink);
    38. m_pipeline->setState(QGst::StatePlaying);
    39. }
    40. void Recorder::record(const QString &uri)
    41. {
    42. m_pipeline->setState(QGst::StateNull);
    43. releaseVideoSink();
    44. filesink->setProperty("location", uri);
    45. m_pipeline->add(queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);
    46. //    camera_src->link(tee);
    47. //    QGst::Element::linkMany(tee, queue0, x_sink);
    48. QGst::Element::linkMany(tee, queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);
    49. setVideoSink(x_sink);
    50. m_pipeline->setState(QGst::StatePlaying);
    51. }

gstreamer——文档/资源/使用的更多相关文章

  1. 互联网常见Open API文档资源

    原文地址:http://blog.sina.com.cn/s/blog_4d8713560100y272.html 所谓的开放API(OpenAPI)是服务型网站常见的一种应用,网站的服务商将自己的网 ...

  2. 文档资源搜索小工具 - 支持PDF,DOC,PPT,XLS

    最近做了一个文档搜索小工具,当然不是网盘搜索工具,这个工具支持四种文件格式搜索(pdf,doc,ppt,xls),你只需要在搜索框中输入你想要搜索资源的关键词,点击搜索按钮即可获取相关资源,点击下载按 ...

  3. Android文档资源大放送 感兴趣的话可以网盘下载(个人收集)

    Google.Android.SDK开发范例大全.第3版源码.rar http://pan.baidu.com/s/1c0epYzm 精通Android 3中文版(Pro Android 3).pdf ...

  4. Java开发API文档资源

    <netty> http://netty.io/4.1/api/index.html < Spring FrameWork > 1   http://spring.io/ 2 ...

  5. Android开发阅读文档资源

    Android Studio:工具:http://developer.android.com/intl/zh-cn/tools/studio/index.html培训教程:http://develop ...

  6. odoo 有哪些文档资源

    // openbook [覆盖 openerp 7 及之前版本] https://doc.odoo.com/     // 最新的 odoo documentation user[覆盖 odoo 9] ...

  7. L18 如何快速查找文档获得帮助

    原地址:http://www.howzhi.com/course/286/lesson/2121 查找文档快速 苹果提供了丰富的文档,以帮助您成功构建和部署你的应用程序,包括示例代码,常见问题解答,技 ...

  8. [中文版] 可视化 CSS References 文档

    本文分享了我将可视化 CSS References 文档翻译成中文版的介绍,翻译工作还在陆续进行中,供学习 CSS 参考. 1. 可视化 CSS References 文档介绍 许多 CSS 的文档都 ...

  9. OpenShare文档管理不完整功能清单

    文档结构管理 以网站集-网站的方式建立各部门的文档管理中心,让文档管理更加规范,使用户更加方便地进行浏览.查找和使用文档资源. 文档全生命周期管理 结合定制开发的工作流平台对文档的全生命周期(创建.获 ...

随机推荐

  1. linux IP动态变动之后 , 需要做的杂项操作

    linux的动态ip经常变来变去,目前还没找到固定它不变化的方法.所以每次变动之后都需要做以下的操作,极其麻烦.(必须找到让linux IP 固定的方法) 1.先找到变化之后的动态ip地址 ifcon ...

  2. Photoshop脚本之调试

    系统:mac 创建test.scpt和test.jsx command+空格,打开 脚本编辑器(applescript) 脚本编辑器打开test.scpt 输入: tell application & ...

  3. CGI(Common Gateway Interface),通用网关接口

    通用网关接口,简称CGI,是一种根据请求信息动态产生回应内容的技术.通过CGI,Web 服务器可以将根据请求不同启动不同的外部程序,并将请求内容转发给该程序,在程序执行结束后,将执行结果作为回应返回给 ...

  4. 用ActivatedRoute获取url中的参数

    突然让我用ActivatedRoute import {Injectable} from "@angular/core"; import {ActivatedRoute} from ...

  5. HDU1712ACboy needs your help【分组背包】

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  6. Python 使用MySQL

    在导入MySQLdb之前,需要安装MySQLdb模块.使用pip安装,命令如下: pip install MySQL-python 安装成功后,导入MySQLdb模块 import MySQLdb 连 ...

  7. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.2——将Eclipse开发的项目导入到AndroidStudio

    问题: 你想要将一个Eclipse ADT项目导入到Android Studio中. 解决方案: Android Studio提供了一个导入向导,可以重写已有的项目. 详细: 在Android Stu ...

  8. jmeter3.3测试webservice 接口

    1.天气预报网站,提供webservice接口 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 2.选择测试的接口getSupp ...

  9. OSPF-lsa-types

  10. boost::lockfree::queue

    #include <boost/thread/thread.hpp> #include <boost/lockfree/queue.hpp> #include <iost ...