gstreamer——文档/资源/使用

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)可以看到,绑定的方法有两种,

[cpp] view plaincopy

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

对应的释放方法为:

[cpp] view plaincopy

  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的源码贴在下面:

[cpp] view plaincopy

    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. }
时间: 2024-10-06 02:47:55

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

互联网常见Open API文档资源

原文地址:http://blog.sina.com.cn/s/blog_4d8713560100y272.html 所谓的开放API(OpenAPI)是服务型网站常见的一种应用,网站的服务商将自己的网站服务封装成一系列API(Application Programming Interface,应用编程接口)开放出去,供第三方开发者使用,这种行为就叫做开放网站的API,所开放的API就被称作OpenAPI(开放 API). 网站提供开放平台的API后,可以吸引一些第三方的开发人员在该平台上开发商业

零基础学python-14.1 python的文档资源:注释和dir()

1.文档资源列表 形式 角色 #注释 文件中的文档 dir函数 对象中可用属性列表 文档字符串:__doc__ 附近在对象上的文档 pydoc:help() 对象的交互帮助 pydoc:html报表 浏览器中的模块文档 标准手册 正式的语音和库的说明 网站资源 在线教程.例子等 出版的书籍 商业参考书籍 2.注释 使用#号注释,一般用来说明小功能,如果较大型的功能,一般使用文档字符串 >>> aList=[]#新建一个列表 3.dir() 内建函数dir()抓取对象内可用所有属性列表的简

利用Python3内置文档资源高效学习及官方中文文档

从前面的对Python基础知识方法介绍中,我们几乎是围绕Python内置方法进行探索实践,比如字符串.列表.字典等数据结构的内置方法,和大量内置的标准库,诸如functools.time.threading等等,而我们怎么快速学习掌握并学会使用这个Python的工具集呢? 我们可以利用Python的内置文档大量资源既可以掌握许多关于Python工具集的基本使用. dir函数 Python中内置的dir函数用于提取某对象内所有属性的方法,,诸如对象的方法及属性 L = [1, 2, 3, 4] p

零基础学python-14.3 python的文档资源:help函数

python除了提供__doc__来查询文档字符串,还提供另外的一种方法来查询文档字符串:help 下面是我们自己建立的一个类,使用help打印,形成相关的报表信息 >>> class Test(): '这是一个测试类' def helloworld(): '测试方法' print('hello world') >>> help(Test) Help on class Test in module __main__: class Test(builtins.object

零基础学python-14.2 python的文档资源:文档字符串

这一章节我们来说说文档字符串:__doc__ 文档字符串其实也是注释的一种,但是它一般放在模块文件.函数或者类语句的顶部,主要用来说明它们是干什么的,为什么这样做 python会自动封装这些文字,放到__doc__属性里面 >>> def test(): '这是一个测试方法' print('hello world') >>> test.__doc__ '这是一个测试方法' >>> >>> class Test(): '这是一个测试类'

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

Google.Android.SDK开发范例大全.第3版源码.rar http://pan.baidu.com/s/1c0epYzm 精通Android 3中文版(Pro Android 3).pdf  http://pan.baidu.com/s/1kTr8RaB 大话企业级Android应用开发实战.pdf   http://pan.baidu.com/s/1o6Bf7RW Android开发权威指南.pdf http://pan.baidu.com/s/1qWyQoaw android.c

odoo 有哪些文档资源

// openbook [覆盖 openerp 7 及之前版本] https://doc.odoo.com/ ? ? // 最新的 odoo documentation user[覆盖 odoo 9] https://www.odoo.com/documentation/user/9.0/ ? ? // 最新的 odoo documentation technical [覆盖 odoo 8/9] http://www.odoo.com/documentation/8.0/index.html h

GraphQL 文档资源

1.GraphQL入门有这一篇就足够了 原文地址:https://www.cnblogs.com/liujinyu/p/12230450.html

Python学习文档指引

Python文档资源: 形式 角色 #注释 文件中的文档 dir函数 对象中可用属性的列表 文档字符串:__doc__ 附加在对象上的文件中的文档 PyDoc:help函数 对象的交互帮助 PyDoc:HTML报表 浏览器中的模块文档 标准手册 正式的语言和库的说明 网站资源 在线教程.例子等 出版的图书 商业参考书籍 1.#注释 #注释只能从源代码文件中看到,若要查看#注释信息,只需要获取相应的模块文件即可. 2.Dir函数 获取对象内可用所有属性列表的简单方式(如,对象的方法以及简单的数据项