zoukankan      html  css  js  c++  java
  • 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.   
      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. }  
  • 相关阅读:
    《DSP using MATLAB》 示例 Example 9.12
    《DSP using MATLAB》示例 Example 9.11
    《DSP using MATLAB》示例 Example 9.10
    《DSP using MATLAB》示例Example 9.9
    《DSP using MATLAB》示例 Example 9.8
    《DSP using MATLAB》示例Example 9.7
    《DSP using MATLAB》示例 Example 9.6
    《DSP using MATLAB》示例Example 9.5
    《DSP using MATLAB》示例 Example 9.4
    (转载)【C++11新特性】 nullptr关键字
  • 原文地址:https://www.cnblogs.com/subo_peng/p/4681911.html
Copyright © 2011-2022 走看看