Qt 使用 Phonon 这个多媒体框架来提供播放常见多媒体格式文件的功能,其中媒体文件可以是本地文件或者通过 QURL 指向的网络流文件。
在下面的概览中,会涉及到 Phonon 的主要概念、内部机制、核心 API 类以及如何使用这些 API 类。
【内部机制】
Phonon 有三个基本概念:媒体对象、接收端和路径。一个媒体对象管理一个媒体源,比如一个音乐文件;它提供了简单的播放控制,比如开始、停止和暂停播放。一个接收端输出来自 Phonon 的媒体,比如,通过提供录像到一个窗口,或者通过提供声音到一个声卡上。路径是用来连接 Phonon 对象的,比如,一个媒体对象和一个接收端,从而构成了 Phonon 中的 media graph ,如下:
上图中,音乐的播放是由 media object 启动和管理的,并且 media object 把媒体流发送给通过路径( path )连接到它的接收端( sink ),继而接收端( sink )通过声卡播放媒体流。
【 Media Objects 媒体对象】
媒体对象,作为 MediaObject 类的实例,让使用者可以开始、暂停和停止一个媒体流文件的播放,也就是说它提供了对于媒体播放的基本控制,可以假想其为一个简单的媒体播放器。
媒体数据是由一个媒体源提供的,而媒体源是由媒体对象来保持的。媒体源是 MediaSource 的一个实例,在 Phonon 中是一个单独的对象。它为媒体对象提供原始数据,这些数据可以来自本地文件或者网络流。源的内容将会被媒体对象所解释。
一个媒体对象通常是使用默认构造函数进行实例化并为其提供一个媒体源。具体的代码将会在后面给出。
作为对媒体对象的补充, Phonon 还提供了 MediaController ,它管理一个媒体文件可选的特征,比如 DVD 中的章节、菜单和标题等信息。
【 Sink 接收端】
Sink 就是一个虚拟的音像设备,将视频或者声音发送到物理视频设备或物理音频设备。它对媒体处理方面有着基本控制,比如,控制音量或者静音,又比如,改变亮度、色调或者缩放比例。
一个示例可见下图:
上图是一个有声视频 avi 文件的播放机制图。媒体源 DieHard.avi 由 MediaObject 进行管理,而 MediaObject 与两个 Sink 通过 Path 连接,一个是 Audio Sink ,管理着声音播放,另一个是 Video Sink ,管理着视频播放。最终都是由 Sink 将媒体数据传送给物理设备。
【 Processors 处理机】
Phonon 不允许对媒体流的直接操作,但是可以使用 processors 来做这项工作。它位于某条路径上,作用是转换该路径上的音频流。