zoukankan      html  css  js  c++  java
  • linux下Qt实现的播放器

      Qt在图形界面程序开发上确实具有相当重要的地位,很多软件都是用Qt开发的比如autodesk的maya,Qt开发的图形界面的确相当吸引人,至少比MFC漂亮(个人觉得),这也是我喜欢Qt的主要原因。

      视频文件的播放,实际上是四个过程。首先是文件的读取,再将文件数据分流成视频流和音频流,之后分别进行解码,最后输出解码数据,同步音频视频的输出实现视频的播放。这里利用Qt提供的Phonon库实现一个简单播放器,以供学习练手之用。播放器在功能上能够播放视频音频文件,能够调整进度和声音大小,能够记录播放历史,能够截屏和全屏播放,并且启动程序时会显示进度和关于信息。视频文件支持avi、rmvb、flv格式的文件,音频文件支持mp3和wma格式。截屏后图片保存为png格式。简要介绍一下Phonon库,下图为Phonon的架构:

    MediaObject :
        Phonon的基础,用于管理多媒体来源。来源可能是影音档等,能够提供基本的播放控制,例如开始、暂停或结束。而提供多媒体数据给MediaObject的则为media source,在给MediaObject之前通常是raw data,再由MediaObject进行转换。 

    Sinks :
          输出多媒体,例如在widget上播放影片或是输出至声卡(播放音乐)。通常sink是一个播放的装置(例如声卡等)。而sink只接受MediaObject来的数据,由MediaObject控制播放;而由sink来处理这些多媒体 

    paths :
      用来连接Phonon的对象,意即MediaObject与Sink之间的连接。

      播放器的结构类图如下:

      

      一共定义了五个类,主类为Player类,即播放器主界面;ManageList类用于管理播放列表;FileProperty类为文件属性窗口类;PathURI类为路径选择窗口类;WizardPage为关于窗口类,每个类的构造函数和析构函数这里我没有列出来。Player类中的函数都是槽函数(private slots),Qt的一个特点就是信号和槽机制,将信号和对应需要执行的槽函数链接起来就能实现对事件的响应或者处理。Qt提供了两种方法完成信号和槽的映射,一种是直接在Qt creator界面中添加信号和槽函数的映射关系,另一种则是在代码中添加connect函数来实现。

      其中Player类中的media成员指向一个播放器对象,完成文件读取和分流的任务;vwidget指向播放界面,实现视频的播放;aOutput指向音频输出,实现音频的播放。volumeSlider指向音量控制控件,seekSlider指向播放进度控件。用createPath将media与vwidget链接起来,同样再将media与aOutput链接起来,使用Phonon提供的函数,实现3个按钮的功能,相当简单~~

     1     media = new Phonon::MediaObject;
     2     vwidget = new Phonon::VideoWidget(ui->centralwidget);   //播放器界面
     3     Phonon::createPath(media,vwidget);
     4 
     5     //设置可播放的文件类型
     6     vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);
     7     aOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
     8     Phonon::createPath(media,aOutput);
     9     volumeSlider = new Phonon::VolumeSlider;
    10     volumeSlider->setAudioOutput(aOutput);
    11 
    12     volumeSlider->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum);
    13     seekSlider = new Phonon::SeekSlider;
    14     seekSlider->setMediaObject(media);
    View Code
     1 void Player::on_pbPlay_clicked()
     2 {
     3       media->play();
     4 }
     5 
     6 void Player::on_pbPause_clicked()
     7 {
     8     media->pause();
     9 }
    10 
    11 void Player::on_pbStop_clicked()
    12 {
    13      media->stop();
    14 }
    View Code

      播放器主界面如图所示,比较简略,但效果还不错:

      可以看到,主界面由播放界面、3个按钮、播放进度条、音频条、菜单、播放列表组成,功能也是一目了然,作为一个小播放器已经完全足够了。

      菜单栏里主要功能有:1.File->(Open,OpenURI,Property,Exit)

                2.Edit->(Screenshort,ClearList)

                   3.View->(FullScreen,NormalScreen,HideList)

                4.Sound->(Increase,Decrease)

      如果你想设置一个启动画面来显示进度和一些启动关于信息,则可以创建一个启动窗口类,在主函数中实例化Player类的对象前,先实例化一个启动窗口类,如图所示,图标是我随便从网上找的一个图,当进度条读完后,关于窗口关闭,显示播放器界面窗口。

      

      main.cpp代码如下:

     1 #include <QtGui/QApplication>
     2 #include <QTextCodec>
     3 #include "player.h"
     4 #include "wizardpage.h"
     5 
     6 int main(int argc,char *argv[])
     7 {
     8     QApplication a(argc,argv);
     9     a.setApplicationName("VideoPlayer");
    10     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    11 
    12 
    13     WizardPage pg;
    14     pg.show();
    15     pg.processbar();
    16 
    17     Player w;
    18     pg.close();
    19 
    20     w.show();
    21     return a.exec();
    22 }
    View Code

       完成播放器的设计后还不够,仅仅这样是不能播放任何东西的,因为还需要解码器来解码视频,本程序是在linux下运行的,解码器用的比较好的是Gstreamer,楼主用的centos 6.0,默认状态下是没有安装任何解码器的,有一个省事的办法:centos一般都带了一个影音播放工具,可以直接打开播放一个视频,然后就会出现提示需要解码器,接着点击安装,就会自动安装相关的解码器以及一些必要的插件了,下载安装完成后再运行程序就能进行视频音频的播放了!Enjoy it~

       project下载地址:https://code.google.com/p/system-in-view/downloads/detail?name=Player.zip&can=2&q=#makechanges  有的还需要修改,还可以添加许多功能,比如快进等。

  • 相关阅读:
    centos7安装puppet详细教程(简单易懂,小白也可以看懂的教程)
    centos7.3下安装nginx
    JS实现转动随机数抽奖的特效代码
    【孤独旅者】封装一个三级联动和基于Vue的mintUI三级联动
    【孤独旅者】Vue-封装$on,$emit,$off
    数据可视化,选择Echarts还是Highcharts?
    关于redux和react-redux
    vue 封装一个插件
    vue实现点击回到顶部
    vue实现吸顶
  • 原文地址:https://www.cnblogs.com/XiaoHDeBlog/p/3098260.html
Copyright © 2011-2022 走看看