码迷,mamicode.com
首页 > 其他好文 > 详细

gstreamer——文档/资源/使用

时间:2015-07-28 10:27:36      阅读:859      评论:0      收藏:0      [点我收藏+]

标签:

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

 

gstreamer——文档/资源/使用

标签:

原文地址:http://www.cnblogs.com/subo_peng/p/4681911.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!