首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

在Meego下实现一个播放器——QtGstreamer

2012-09-24 
在Meego上实现一个播放器——QtGstreamer在Meego上实现一个播放器——QtGstreamer网络上关于QtGstreamer的教程

在Meego上实现一个播放器——QtGstreamer

在Meego上实现一个播放器——QtGstreamer
网络上关于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)可以看到,绑定的方法有两种,

#include "recorder.h"#include <QGst/ElementFactory>Recorder::Recorder(QWidget *parent)    : QGst::Ui::VideoWidget(parent){    camera_src = QGst::ElementFactory::make("autovideosrc");    tee = QGst::ElementFactory::make("tee");    queue0 = QGst::ElementFactory::make("queue");    queue1 = QGst::ElementFactory::make("queue");    ffmpegcolorspace = QGst::ElementFactory::make("ffmpegcolorspace");    theoraenc = QGst::ElementFactory::make("theoraenc");    oggmux = QGst::ElementFactory::make("oggmux");    filesink = QGst::ElementFactory::make("filesink");    x_sink = QGst::ElementFactory::make("xvimagesink");    m_pipeline = QGst::Pipeline::create();    m_pipeline->add(camera_src, tee, queue0, x_sink, queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);    camera_src->link(tee);    QGst::Element::linkMany(tee, queue0, x_sink);    QGst::Element::linkMany(tee, queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);}Recorder::~Recorder(){    if (m_pipeline) {m_pipeline->setState(QGst::StateNull);releaseVideoSink();    }}void Recorder::preview(){    m_pipeline->setState(QGst::StateNull);    releaseVideoSink();    m_pipeline->remove(queue1);    m_pipeline->remove(ffmpegcolorspace);    m_pipeline->remove(theoraenc);    m_pipeline->remove(oggmux);    m_pipeline->remove(filesink);    setVideoSink(x_sink);    m_pipeline->setState(QGst::StatePlaying);}void Recorder::record(const QString &uri){    m_pipeline->setState(QGst::StateNull);    releaseVideoSink();    filesink->setProperty("location", uri);    m_pipeline->add(queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);    //    camera_src->link(tee);    //    QGst::Element::linkMany(tee, queue0, x_sink);    QGst::Element::linkMany(tee, queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);    setVideoSink(x_sink);    m_pipeline->setState(QGst::StatePlaying);}

热点排行