[Qt教程] 第49篇 进阶(九) 多媒体应用简介

[Qt教程] 第49篇 进阶(九) 多媒体应用简介

楼主
  发表于 2013-10-7 09:50:36  | 查看: 267 | 回复: 2
多媒体应用简介


版权声明
该文章原创于 作者 yafeilinux ,转载请注明出处!




导语

      Qt对于音频视频的播放和控制等多媒体应用提供了强大的支持。要想使计算机发出响声,最简单的方法是调用QApplication::beep()静态函数;而对于简单的声音播放,可以使用 QSound类;对于简单的动画播放,可以使用QMovie类;要想对音频视频实现更多的控制,可以使用Phonon多媒体框架;而对于音频视频底层的控制,可以使用QtMultimedia模块。
虽然在Qt 5中已经已经放弃了Phonon,但是使用Qt 4时,Phonon还是一个很好的选择,所以这里我们也对其进行了简单介绍。



环境: Windows Xp + Qt 4.8.5+QtCreator2.8.0




目录

一、使用QSound 播放声音
二、Phonon  简介
三、使用Phonon 播放音频
四、使用Phonon 播放视频





正文

一、使用QSound播放声音



1. 新建Qt Gui 应用,名称为“mySound ”,类名“MainWindow ”和基类QMainWindow 保持默认即可。

2. 完成后在mainwindow.cpp 文件中添加头文件 #include   <QSound> ,然后在构造函数中添加如下一行代码:

QSound :: play("../mySound/sound.wav");
        这时运行程序就可以播放指定的音频文件了,注意这里将音频文件放在了项目目录中。因为现在QSound 并不支持资源文件,所以音频文件必须要放在程序外面。除了简单的使用静态函数进行播放外,也可以先构建一个QSound 对象,然后再调用play() 槽进行播放,可以使用stop() 槽来停止声音的播放,还可以使用setLoops() 函数设置播放重复的次数,如果设置为-1 表示无限循环。



3. 先到mainwindow.h 文件中添加前置声明 class QSound ; 然后声明一个私有对象:
QSound   * sound ;
再到mainwindow.cpp 文件中,将构造函数里添加的调用play() 函数的代码更改为:
sound   =   new   QSound ( "../mySound/sound.wav" this );
        然后我们双击mainwindow.ui 文件进入设计模式,向界面上添加两个Push Button 和一个Spin Box ,并将两个按钮的文本分别改为“播放”和“停止”。然后更改Spin Box 的属性,
将最小值minimum 设置为-1 ,将当前值value 设置为1 。最后分别转到两个按钮的clicked() 槽和Spin Box valueChanged(int ) 槽,更改它们的内容如下:

void   MainWindow :: on_pushButton_clicked()
{   //   播放按钮
    sound -> play();
}
void   MainWindow :: on_pushButton_2_clicked()
{   //   停止按钮
    sound -> stop();
}
void   MainWindow :: on_spinBox_valueChanged(int value)
{
    sound -> setLoops(value);  
}



4. 现在运行程序,可以设置播放的次数,然后使用开始按钮进行播放,使用停止按钮来停止播放了。要说明一下,在Windows 平台上,如果设置了循环次数,那么stop() 函数无法立即停止播放,需要完成当前的循环才可以停止播放。



        使用QSound 可以实现一些简短的声音的播放,使用它来实现单击按钮或者其他事件的音效是很好的选择。根据平台的音频设备的不同,如果使用QSound 同时播放多个音频文件,那么后面播放的声音或者会与前面播放的声音进行混合,或者会停止前面播放的声音,在Windows 平台上,新播放的声音会停止前面播放的声音。如果要播放其他格式的音频文件,或者需要对播放进行更多的控制,那么就需要使用Phonon 多媒体框架来实现了。



二、Phonon 简介

Phonon包含三个基本的概念:媒体对象(Media Objects)、汇点(Sinks)和路径(Paths)。媒体对象是MediaObject类的一个实例,用来管理媒体源,例如一个音乐文件,它提供开始、停止和暂停等简单的播放控制功能;汇点用来从Phonon中输出媒体,例如在部件上渲染视频或者将音频传送到声卡,汇点通常是一个渲染设备,如VideoWidget;路径用来连接Phonon对象,例如连接一个媒体对象和一个汇点,这样形成的关系图在Phonon中被称为媒体图(mediagraph)。下图是一个音频流的媒体图:







下图是一个播放带有声音的视频文件的媒体图:




多媒体功能并不是由Phonon本身实现的,而是由后端(也常被称为引擎)实现的,这包含了连接、管理和驱动底层的硬件或中间技术。对于编程人员来说,这意味着媒体的节点,例如媒体对象、处理器和汇点,它们都由后端提供。而且,后端还负责构建媒体图,例如连接各个节点。
       Qt 使用的后端,在Windows 上是DirectShow ,在Mac 上是QuickTime ,在Linux 上是Gstreamer 。依赖于底层的系统,在不同的平台上所提供的功能会有所不同。后端可以显示顶层系统的信息,可以获取它支持的媒体格式,例如AVI mp3 或者OGG 等。



三、使用Phonon播放音频

当播放音频时,需要创建一个媒体对象,然后将它连接到一个音频输出节点,该节点由AudioOutput类提供,它用来将音频输出到声卡。

1. 新建Qt Gui 应用,名称为“myPhonon1 ”,类名“MainWindow ”和基类QMainWindow 保持默认即可。完成后,在项目文件myPhonon1.pro 中添加如下一行代码:

QT         += phonon
然后保存该文件。



2. 再到mainwindow.cpp 文件中添加头文件包含:
#include   <phonon>
#include   <QDebug>
#include   <QUrl>
并在构造函数中添加如下代码:

Phonon :: MediaObject   *mediaObject   =   new   Phonon :: MediaObject ( this );
mediaObject-> setCurrentSource(Phonon::MediaSource("../myPhonon1/mysong.mp3"));
Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
Phonon :: Path   path   =   Phonon :: createPath(mediaObject, audioOutput);
mediaObject-> play();

       AudioOutput 类用来向音频输出设备发送数据,音频输出需要使用createPath() 函数连接到媒体对象上。AudioOutput 提供了函数来控制音量的大小,还可以设置静音,而且Phonon 还使用AudioOutput 提供了一个音量控制部件VolumeSlider 类,它是QWidget 的子类。另外,Phonon 中也提供了播放进度滑块SeekSlider ,该类也是QWidget 的子类,它需要连接到媒体对象上。



3. 往源码目录中添加一个mysong.mp3 文件,运行程序就可以自动播放了。不过,现在还无法进行任何的控制。大家可以查看 《Qt及Qt Quick开发实战精解》 的音乐播放器实例,那是一个比较完整的播放器例子。



四、使用Phonon播放视频



1. 新建Qt Gui 应用,项目名称为“myPhonon2 ”,基类选择QWidget ,类名为“Widget ”。完成后先到项目文件myPhonon2.pro 中添加代码:

QT         += phonon
然后保存该文件。



2. 播放视频,可以使用VideoWidget 类,该部件可以自动选择可用的设备来播放视频。VideoWidget 并不会播放媒体流中的音频,如果要播放视频中的音频,那么就要创建一个AudioOutput 节点。在mainwindow.cpp 文件中添加头文件包含:
#include   <phonon>
#include   <QAction>
#include   <QVBoxLayout>
#include   <QToolBar>

再在构造函数中添加如下代码:
  1. // 创建媒体图
  2. Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);
  3. Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget(this);
  4. Phonon::createPath(mediaObject, videoWidget);
  5. Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(
  6.                                     Phonon::VideoCategory, this);
  7. Phonon::createPath(mediaObject, audioOutput);
  8. mediaObject->setCurrentSource(Phonon::MediaSource(
  9. "../myPhonon2/myVideo.WMV"));

  10. // 创建播放进度滑块
  11. Phonon::SeekSlider *seekSlider = new Phonon::SeekSlider(
  12. mediaObject, this);

  13. // 创建工具栏,包含了播放、暂停和停止动作,以及控制音量滑块
  14. QToolBar *toolBar = new QToolBar(this);
  15. QAction *playAction = new QAction(style()->standardIcon(QStyle::SP_MediaPlay), tr("播放"), this);
  16. connect(playAction, SIGNAL(triggered()), mediaObject, SLOT(play()));
  17. QAction *pauseAction = new QAction(style()->standardIcon(QStyle::SP_MediaPause), tr("暂停"), this);
  18. connect(pauseAction, SIGNAL(triggered()), mediaObject, SLOT(pause()));
  19. QAction *stopAction = new QAction(style()->standardIcon(QStyle::SP_MediaStop), tr("停止"), this);
  20. connect(stopAction, SIGNAL(triggered()), mediaObject, SLOT(stop()));
  21. Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider(audioOutput, this);
  22. volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
  23. toolBar->addAction(playAction);
  24. toolBar->addAction(pauseAction);
  25. toolBar->addAction(stopAction);
  26. toolBar->addWidget(volumeSlider);

  27. // 创建布局管理器,将各个部件都添加到布局管理器中
  28. QVBoxLayout *mainLayout = new QVBoxLayout;
  29. videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  30. mainLayout->addWidget(videoWidget);
  31. mainLayout->addWidget(seekSlider);
  32. mainLayout->addWidget(toolBar);
  33. setLayout(mainLayout);
复制代码
        这里创建了两个路径,分别用于视频流和音频流。创建VideoWidget 时不需要指定类别,它会自动指定为VideoCategory 类别,我们需要做的只是确保AudioOutput 也在同一个类别中。Phonon 中的SeekSlider 类提供了一个滑块来定位媒体流,只要与媒体对象MediaObject 连接后,该部件就可以自动和媒体流的播放进度同步起来,不需要我们手动进行信号和槽的关联。Phonon 中的VolumeSlider 部件提供了一个用来控制音频输出设备音量的滑块,该滑块还会默认显示一个可以设置静音的图标,这个图标可以使用setMuteVisible() 来移除。



3. 需要将一个myVideo.WMV 的视频文件复制到源码目录,然后运行程序,效果如下图所示。





结语

Movie类是一个使用QImageReader来播放动画的便捷类。该类用来显示没有声音的简单动画,主要支持GIF和MNG格式的文件;在Qt 4.6中新加入了QtMultimedia模块来提供一些底层的多媒体功能,比如音频的采集和回放、频谱分析、操作视频帧等。关于这两个类的使用,可以参考《Qt Creator 快速入门》的第13章,进一步学习Phonon的内容,可以参考第14章。



涉及到的源码:  myPhonon1.rar (176.79 KB, 下载次数: 0)  myPhonon2.rar (2.54 MB, 下载次数: 1) mySound.rar (199.64 KB, 下载次数: 1) 



你可能感兴趣的:([Qt教程] 第49篇 进阶(九) 多媒体应用简介)