`
pleasetojava
  • 浏览: 703783 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

使用Qt做一个简易音乐播放器【Phonon浅谈--续】

 
阅读更多

<!-- [if !mso]> <mce:style><!-- v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!-- [endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if !mso]> <object classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui> </object> <mce:style><!-- st1/:*{behavior:url(#ieooui) } --> <!-- [endif]--> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1266185948; mso-list-type:hybrid; mso-list-template-ids:1862710722 981369336 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-text:%1、; mso-level-tab-stop:39.0pt; mso-level-number-position:left; margin-left:39.0pt; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --> <!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} --> <!-- [endif]-->

2010-2-13 使用 Qt 做一个简易音乐播放器【 Phonon 浅谈 -- 续】

在第一篇 Phonon浅谈 中提及到了 Phonon 这个多媒体框架的一些基本知识,于是想着结合这些基本知识来实践一番,做一个简单的音乐播放器。

【步骤一】

新建一个 Qt Gui 工程,在建立过程中需要包含 Phonon 模块,之后生成文件如下图:

<!-- [if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:148.5pt; height:115.5pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.jpg" mce_src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.jpg" o:title="0"/> </v:shape><![endif]--><!-- [if !vml]--><!-- [endif]-->

Qt Gui 工程会生成一个 ui 文件,在这里是 mainwindow.ui 。双击 mainwindow.ui 进行一番简单的布局,如下图:

<!-- [if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" style='width:219pt;height:252.75pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg" mce_src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg" o:title="2"/> </v:shape><![endif]--><!-- [if !vml]--><!-- [endif]-->

关于这个 ui 界面,中央位置是一个 QListWidget ,用来显示音乐文件列表;下面一栏红色矩形是一个 QVBoxLayout 垂直布局部件,用来确定等会要建立的播放进度条的位置;而下面则是四个相关控制按钮。

大概地说, Phonon 的工作机制是使用 MediaObject 来管理 MediaSource 即源文件,通过 Path 连接到 AudioOutput ,最后是由 AudioOutput 将数据发送到相关物理设备。

于是有了步骤二。

【步骤二】

步骤一是用来实现基本的界面,而步骤二是用代码实现具体的功能。

基于对 Phonon 的认识,有了以下四点:

<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style="mso-spacerun:yes" mce_style="mso-spacerun:yes">&nbsp;</span>= 1 /* GB3 <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]--> <!-- [if supportFields]><span lang=EN-US><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->使用 MediaObject 管理媒体源

<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style="mso-spacerun:yes" mce_style="mso-spacerun:yes">&nbsp;</span>= 2 /* GB3 <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]--> <!-- [if supportFields]><span lang=EN-US><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->使用 AudioOutput 连接物理设备

<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style="mso-spacerun:yes" mce_style="mso-spacerun:yes">&nbsp;</span>= 3 /* GB3 <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]--> <!-- [if supportFields]><span lang=EN-US><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->使用 SeekSlider 实现进度条

<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style="mso-spacerun:yes" mce_style="mso-spacerun:yes">&nbsp;</span>= 4 /* GB3 <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]--> <!-- [if supportFields]><span lang=EN-US><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->使用 QList 实现播放列表

于是产生了相应的代码:

并且需要在构造函数里面将 mediaObject audioOutput 连接起来:


从而使得数据能从 mediaObject 到达 audioOutput ,再通过物理设备播放。

<!-- [if !supportLists]-->1、 <!-- [endif]-->要播放音乐首先需要有源文件,所以先实现添加文件的功能。

首先,将添加按钮和添加功能连接起来:


从而实现点击按钮激活相应操作的功能,而添加音乐文件的槽的代码如下:

上述代码是使用 QFileDialog getOpenFileNames 方法获取若干个音乐文件,然后再使用 Qt 中的 foreach 遍历每个选中的文件,将其添加到播放列表中。

<!-- [if !supportLists]-->2、 <!-- [endif]-->播放、暂停和停止的基本实现

同样的先将信号和槽连接起来:

之后再具体实现相应的简单功能,这里列出 playFile 的代码:

首先判断列表是否为空,接着设置播放队列,然后播放当前文件,最后使得播放按钮不可用,而激活暂停按钮。其它的功能类似,都是使用 mediaObject 的方法。

【步骤三】

这里只简单地实现播放功能,当然还是可以再继续扩展功能,不过这是后话了。

运行的效果图如下:

<!-- [if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:222pt;height:266.25pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.jpg" mce_src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.jpg" o:title="3"/> </v:shape><![endif]--><!-- [if !vml]-->

此时就能听见蛮好听的《左边》了^_^

以下是全部代码:

mainwindow.h:

mainwindow.cpp:

main.cpp:


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics