Phonon Multimedia framework(Phonon多媒体框架)

闲的蛋疼,最近要用到Phonon,了解不多,就翻译一下官方文档吧,Mark一下。顺便练下表达能力,要考六级了,就当复习吧。

文档的地址在:Phonon multimedia framework


简介

Phonon多媒体框架是QT库的主要多媒体播放框架(据说还有一个叫MultiMedia模块)。可以通过文件或者通过QURL来读取一个网络媒体流。
这份简介中,我们涉及Phonon的一些主要概念,也会介绍到phonon的架构,一些主要的API,还有一些使用API的例子。

架构

Phonon的三个基本概念是:mediaObject,sinks,paths。
故名思议,media object是用来控制多媒体源的,比如,一个音乐文件;它可以提供像开始,暂停,停止之类的播放控制。而sink是用来输出Phonon的多媒体源的,比如输出视频到widget或者将音频输出到声卡。Paths则是连接media object和sink的桥梁,形成一个media graph(媒体流图??不知道怎么翻译,好像有向图之类的东西)。
下面是一个音频流的media graph



MediaObject向那些通过path与其建立联系的sink发送媒体流,从而控制媒体的播放。然后sink通常通过声卡将媒体流播放出来。

Media Objects

media object 是MediaObject类的实体,可以通过它来实现对媒体流播放的控制,比如开始,暂停,停止等。它提供对播放过程的最基本的控制,可以将其想象为一个简易的媒体播放器。

media source(媒体源)提供的数据由media object保存。而media source(媒体源)是一个MediaSource的实例,但它本身并不是Phonon框架中流的一部分。它给media object提供来自文件或者网络流的原始数据,而具体的数据内容解释就由media object来完成。

media object总是通过默认构造器实例化,提供media source。具体实现代码样例稍后会给出。

作为media object的一个实现,Phonon也提供了一个MediaController类,用来对媒体一些特征的选项控制。例如,一些VOB(DVD)文件播放时的章节,菜单,标题等,都可以通过MediaController来控制。

Sinks

sink是Phonon媒体流的接收点,也就是说它不会再将数据输出到别的地方而是自己处理。sink通常就是一个数据实现设备。

输出到sink的数据来源都是media object,但是途中可能经过许多其他的一些节点。

Mediaobject控制着播放过程,而sink则是可以对媒体数据进行最低层的操作,比如一个audio sink(音频接收点)可以控制声音的大小和是否静音,你可以想象它是一个虚拟的音频设备。另一个例子是VideoWidget类,可以在QWidget中实现,并且可以自动调节光强度,灰度,和视频的大小。
下面是一个音视频文件的播放流图:



Processors

Phonon不允许直接对媒体流的直接操作,也就是说媒体流 给一个media object后不能通过通过程序来调整媒体流的字节数据。而我们有其他的方法去完成这个事情,利用processor。processor在媒体播放流中的位置是media object到其相应的sink也就是接收点之间的path上。在Phonon中,processor表现为Effect类。

当processor被插入到媒体流中进行渲染过程时,它会一直在对媒体流有效果直到我们移除它。

Effect类控制了媒体流的控制过程,processor可以提供一个深度的叠加效果到音频上,例如,它可以量化施加的叠加效果。Effect可以配置到任何时候进行。

Playback

有时候,我们并不需要自己去构建这些框架。Phonon有建立普通适用框架的函数。例如播放音频文件,可以使用 createPlayer() ,它会自动完成需要的流程,并且返回到media object中,然后就可以直接使用media对象的 play() 函数。

Phonon::MediaObject *music = 
	Phonon::createPlayer(Phonon::MusicCatagory,							Phonon::MediaSource("/path/mysong.wav"));
music->play();











同样,对于视频文件也有类似的解决方法,VideoPlayer类:
Phonon::VideoPlayer *player = 
	new Phonon::VideoPlayer(Phonon::VideoCategory,
	parentWidget);
player->play(url);

VideoPlayer是一个视频播放的widget类。

使用Phonon需要在Qt工程配置文件.pro中加上下列语句:
QT += phonon

Phonon中有几个用来控制多媒体播放的工具:SeekSlider用来控制媒体流的播放位置,VolumeSlider用来控制声音大小,EffectWidget则是用来控制媒体播放效果。具体使用可以在API文档中了解到。

Building Graphs手动建立播放流

如果想对播放过程进行更多的定制,而不是直接使用上述的各种简易播放模块的话,就要自己建立Phonon的播放流了。下面来看下一些通用的播放流是怎样建立的。一个播放流的开始是从media object的play()函数开始的。

如果这个media object包含几种不同的媒体类型,例如,一个音视频流,那这个播放流就要有两个输出,一个音频输出,一个视频输出。

接下来看下代码如何实现

Audio(音频)

播放音频的时候,需要创建一个media object并且把它连接到一个继承自AbstractAudioOutput类的音频输出接收点。目前提供的是AudioOutput类,可以将音频流输出到声卡。下面是实现代码:
Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);

mediaObject->setCurrentSource(Phonon::MediaObject("/mymusic/bariegirl.wav"));

Phonon::AudioOutput *audioOutput =
	new Phonon::AudioOutput(Phonon::MusicCategory,this);

Phonon::Path path = Phonon::createPath(mediaObject,audioOutput);

注意到播放的媒体资源的类型是由Phonon来解析的,我们不需要担心这个问题。如果一个媒体资源包含有多种媒体类型,它也是由Phonon自动处理的(实际上决定于后端插件,后面会讲到)。
media object总是通过默认构造器来构造的,它处理所有的多媒体格式。
AudioOutput中的范围(Category)设置,像Phonon::MusicCategory并不影响实际的播放过程,这个范围设置是被KDE用来控制播放的,例如控制板块。
AudioOutput类用来输出声音数据到系统音频设备,例如声卡。系统音频设备可以包括声卡或者一个中介设备,比如windows系统中的DirectShow。可以通过setOutputDevice()来改变系统默认的音频输出设备。
AudioOutput会自动处理后端插件支持的所有音频格式,所以我们无需知道媒体文件具体是什么格式的格式。
具体的音频播放例子看这里:Phonon Music Player

Audio Effects(音频效果)

假如一个媒体不能被直接处理,后端插件会对其进行相应的处理。这些处理过程分布在媒体流从mediaObject到输出节点(例如,AudioOutput)之间。这些处理过程是继承自Effect 类,而实际的效果处理是否可行依赖于低层操作系统。后面Querying Backends for Support部分会提到如何在特定的系统解析这些可行的效果处理。
接下来,我们继续看下如何通过Path变量来增加效果处理:
Phonon::Effect *effect =
	new Phonon::Effect(
		Phonon::BackendCapabilities::availableAudioEffects()[0],this);
	
path.insertEffect(effect);
这里我们简单得使用了系统上第一个可用的效果处理。

如果媒体流在播放,一旦效果被插入到媒体播放流中,它会马上开始作用。要停止使用这个效果,就必须再次对之前的Path使用removeEffect()

Video

VideoWidget是用来播放视频的。这个类不仅作为视频播放流中的一部分,同时也是视频输出流的载体。这个类会自动选择一个可用的设备来播放视频,通常是一个QT程序和图形卡的一个中间设备,比如windows系统的DirectShow,linux的GStreamer。
videowidget本身并不播放音频流,如果想要播放音频流,就需要一个AudioOutput,就像之前一样创建并建立连接。
下面是一个实现代码:
Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);

Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget(this);

Phonon::createPath(mediaObject,videoWidget);

Phonon::AudioOutput *audioOutput = 
	new Phonon::AudioOutput(Phonon::VideoCategory,this);
	
Phonon::createPath(mediaObject,audioOutput);

VideoWidget不需要设置到一个范畴,它会自动被归类到VideoCategory,我们只需要将音频输出(AudioOutput)指定到同一个范畴即VideoCategory
media object会在将媒体流发送到别的节点前,将媒体文件分成不同的媒体部分并分别发送 到不同的流中。由media object来决定分发到不同节点的媒体类型。

Backends(后端插件)

多媒体功能的实现并不是Phonon来实现的,而是后端插件,或者称之为引擎。这些功能包括连接,控制和驱动底层硬件或者一个中间设备比如win下的DirectShow。对于编程来说,这意味着播放流中的这些节点,比如media object,processors和sinks这些,是后端插件支持的。而且通过建立一个流图来工作,也就是把这些节点连接起来。

Qt在windows平台的后端插件是使用DirectShow(需要DirectX支持),Mac平台是QuickTime,linux平台则是GStreamer。Qt功能在不同平台的提供是取决于底层操作系统和一些其它因素,比如支持的媒体格式。

后端插件可以提供底层系统的一些信息,比如支持哪些媒体格式,比如,AVI,MP3,或者是OGG。

用户可以为底层系统增加新的格式支持或者滤波器,例如安装DivX解码器。因此我们准确无法给出QT后端插件究竟支持多少种格式。

Querying Backends for Support

上面说到Phonon的实现是基于后端插件的,而对于不同的后端插件,API的支持也许并不完整。所以应用程序需要检查后端插件是否有其需要的函数实现。下面我们来看看这个检查过程是怎么实现的。
 
后端插件通过availableMimeType()isMimeTypeAvailable()函数来确认哪一种MIME类型可以提供给播放流中的节点使用。这些类型通过字符串的形式给出,在不同后端和平台中类型名字都一样。

如果后端插件的发生变化,后端会发出一个信号 Notifer::capabilitiesChanged(),如果可用的音频设备发生变化,后端则会发出一个信号Notifer::availableAudioOutputDevicesChanged()

如果要确定实际的音频设备,我们可以使用上面Sinks部分中介绍的availableAudioOutputDevice(),还可以通过name()检测设备的一些信息,返回的字符串确定于操作系统,qt的后端插件不会继续深入分析这些设备。

视频播放的底层节点并没有选择播放设备,为了方便起见,VideoWidget即是流的一个节点也是视频播出的一个载体。为了确定不同的视频格式是否被支持,可以是用isMimeTypeAvailable()。并通过Phonon::createPath()来绑定path,也就是流通的路径。建立media object后,还可以调用它的hasVideo()函数。

更多可以看这里:Capabilities Example


Installing Phonon

下面的安装过程就不翻译了,大概总结一下就可以了:

windows 平台

windows下需要安装DirectX和DirectShow的9.0或者更新版本,需要从微软下载相关的SDK。
xp及xp以后的系统版本
在构建QT库之前,先下载SDK到下面地址并执行脚本:
C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\setenv.cmd

注意:安装过Visual C++ 2008就不需要上述步骤了
xp的版本
环境设置
就是把安装的windows SDK的地址添加到系统环境变量

Linux平台

不同linux发行版本的GStreamer库名字不一样,一般来说使用包管理找到libgstreamer的相关库安装即可。比如fedora用yum grep|list 找一下。

Mac OS X 平台

安装QuickTime,最低支持版本为7.0。


(后记:这次是第一次翻译文档,感觉挺费事的,这一次的内容比较简单,以后要常常翻译一些干货,锻炼一下阅读与表达能力,还有以后绝对绝对不在csdn博客的编辑框或者在其他任何博客的编辑框里面直接写,都用markdown写吧,后期再添加图片。)

Edit by mooncake
2013/04/21







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值