来源:http://blog.csdn.net/htttw/article/details/7842295

iPhone播放音乐

今天我们简要介绍如何在iPhone中播放音乐:

强烈建议你参考官方文档(需要登录):

http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html%23//apple_ref/doc/uid/TP40008067

1.

打开XCode,新建一个Window-based Application,项目名称是MusicPlayer:

2.

打开MainWindow.xib,按下图加入控件:

其中,最上面是两个Label,左边的Current(sec)始终不变,右边的0显示当前已播放的时间,下面是一个Slider,类似与一般播放器的进度条,再下面是音量调节的Slider,它们的min都是0.0,max都是1.0。最底下是两个Button。

3.

由于播放声音需要用到AVFoundation.framework,因此我们将它加入到我们的工程中:

右击Frameworks,选择Add/Existing Frameworks,加入AVFoundation:

4.

打开MusicPlayerAppDelegate.h,修改如下:

  1. //
  2. //  MusicPlayerAppDelegate.h
  3. //  MusicPlayer
  4. //
  5. //  Created by HuTao on 8/8/12.
  6. //  Copyright __MyCompanyName__ 2012. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import <AVFoundation/AVFoundation.h>
  10. @interface MusicPlayerAppDelegate : NSObject <UIApplicationDelegate>
  11. {
  12. UIWindow * window;
  13. IBOutlet UIButton * btnPlay;
  14. IBOutlet UILabel * labelVolume;
  15. IBOutlet UILabel * labelCurrentTime;
  16. IBOutlet UISlider * sliderCurrentTime;
  17. NSTimer * playTimer;
  18. AVAudioPlayer * player;
  19. }
  20. @property (nonatomic, retain) IBOutlet UIWindow * window;
  21. @property (nonatomic, retain) IBOutlet UIButton * btnPlay;
  22. @property (nonatomic, retain) IBOutlet UILabel * labelVolume;
  23. @property (nonatomic, retain) IBOutlet UILabel * labelCurrentTime;
  24. @property (nonatomic, retain) IBOutlet UISlider * sliderCurrentTime;
  25. -(IBAction)soundStartOrPause:(id)sender;
  26. -(IBAction)soundStop:(id)sender;
  27. -(IBAction)volumeChanged:(id)sender;
  28. -(IBAction)currentTimeChanged:(id)sender;
  29. -(void)updateSoundAt:(float)percent;
  30. -(void)updateCurrentTime;
  31. -(void)initPlayer;
  32. @end

首先,加入:

  1. #import <AVFoundation/AVFoundation.h>

其次:

btnLabel,labelVolume,labelCurrentTime,sliderCurrentTime都是控件对应的Outlet:

btnLabel:在点击了Start按钮后文本需要变成Pause,所以我们给Button也增加了一个Outlet;

labelVolume,labelCurrentTime:在滑动Slider时对应的Label也需要变化以反应当前值;

sliderCurrentTime:歌曲播放时需要通过Slider来反应当前已播放的时间,因此Slider也需要一个Outlet。

之后的playerTimer会每一定时间运行一次,根据当前已播放的时间更新进度条;AVAudioPlayer是AVFoundation提供的播放音乐的一个类。


之后的四个IBAction分别是:按下Start按钮;按下Stop按钮;滑动音量的Slider;滑动已播放时间的Slider对应的Action。

5.

打开MusicPlayerAppDelegate.m,修改如下:

  1. //
  2. //  MusicPlayerAppDelegate.m
  3. //  MusicPlayer
  4. //
  5. //  Created by HuTao on 8/8/12.
  6. //  Copyright __MyCompanyName__ 2012. All rights reserved.
  7. //
  8. #import "MusicPlayerAppDelegate.h"
  9. @implementation MusicPlayerAppDelegate
  10. @synthesize window;
  11. @synthesize btnPlay;
  12. @synthesize labelVolume;
  13. @synthesize labelCurrentTime;
  14. @synthesize sliderCurrentTime;
  15. #pragma mark -
  16. #pragma mark Application lifecycle
  17. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  18. {
  19. //初始化AVAudioPlayer
  20. [self initPlayer];
  21. [window makeKeyAndVisible];
  22. return YES;
  23. }
  24. -(void)initPlayer
  25. {
  26. NSString * path = [[NSBundle mainBundle] pathForResource:@"北京欢迎你" ofType:@"mp3"];
  27. //判断是否找到该音乐文件
  28. if (path)
  29. {
  30. NSLog(@"Init sound");
  31. //用path路径初始化AVAudioPlayer
  32. player = [[AVAudioPlayer alloc]initWithContentsOfURL:[[NSURL alloc]initFileURLWithPath:path]error:nil];
  33. //初始化播放器
  34. [player prepareToPlay];
  35. //设置播放循环次数:如果numberOfLoops为负数 音频文件就会一直循环播放下去
  36. player.numberOfLoops = -1;
  37. //设置音频音量:volume的取值范围在[0.0f, 0.1f]之间
  38. player.volume = 0.5f;
  39. //将当前播放进度调为0
  40. [self updateSoundAt:0.0f];
  41. }
  42. }
  43. -(void)updateSoundAt:(float)percent
  44. {
  45. float atTime = (player ? player.duration * percent : 0.0f);
  46. NSString * time = [NSString stringWithFormat:@"%d", (int)atTime];
  47. labelCurrentTime.text = time;
  48. sliderCurrentTime.value = percent;
  49. }
  50. -(IBAction)soundStartOrPause:(id)sender
  51. {
  52. //点击Start按钮后开始播放音乐
  53. if(player)
  54. {
  55. UIButton * btn = (UIButton *)sender;
  56. if(![player isPlaying])
  57. {
  58. NSLog(@"Start sound");
  59. [player play];
  60. [btn setTitle:@"Pause" forState:UIControlStateNormal];
  61. if(!playTimer)
  62. {
  63. playTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateCurrentTime) userInfo:nil repeats:YES];
  64. }
  65. }
  66. else
  67. {
  68. NSLog(@"Pause sound");
  69. [player pause];
  70. [btn setTitle:@"Start" forState:UIControlStateNormal];
  71. }
  72. }
  73. }
  74. -(void)updateCurrentTime
  75. {
  76. [self updateSoundAt:1.0 * player.currentTime / player.duration];
  77. }
  78. -(IBAction)soundStop:(id)sender
  79. {
  80. //停止播放声音
  81. if(player)
  82. {
  83. NSLog(@"Stop sound");
  84. player.currentTime = 0;
  85. [player stop];
  86. [btnPlay setTitle:@"Start" forState:UIControlStateNormal];
  87. [self updateSoundAt:0.0f];
  88. }
  89. }
  90. -(IBAction)volumeChanged:(id)sender
  91. {
  92. UISlider * slider = (UISlider *)sender;
  93. NSString * value = [[NSString alloc]initWithFormat:@"%d%%", (int)(slider.value * 100)];
  94. labelVolume.text = value;
  95. player.volume = slider.value;
  96. [value release];
  97. }
  98. -(IBAction)currentTimeChanged:(id)sender
  99. {
  100. UISlider * slider = (UISlider *)sender;
  101. int time = (player ? slider.value * player.duration : 0);
  102. player.currentTime = time;
  103. [self updateSoundAt:slider.value];
  104. }
  105. - (void)dealloc
  106. {
  107. [window release];
  108. [btnPlay release];
  109. [labelVolume release];
  110. [labelCurrentTime release];
  111. [sliderCurrentTime release];
  112. [super dealloc];
  113. }
  114. @end

有几点说明:

1.先将要播放的音乐加入到Resouces中;

2. playTimer定时器每0.5秒运行一次,更新当前的进度条;

6.

下面要开始将控件和IBOutlet以及IBAction相连接了:

(a)

打开MainWindow.xib,按住Ctrl键,鼠标从Music Player Delegate上拖动到相应的Label上,将它和IBOutlet相连接:

要注意的是不要忘了连接btnStart!一共要连两个Slider,两个Label和一个Button。

(b)

右键Button,选择Touch Up Inside,将后面的小圆圈拖动到Music Player Delegate上,连接相应的IBAction:

要注意的是Slider需要连接ValueChanged事件:

7.

运行结果如下:

最后我把代码也上传上来了:

http://download.csdn.net/detail/htttw/4484442

完成!

iPhone播放音乐的更多相关文章

  1. iOS开发系列--扩展--播放音乐库中的音乐

    众所周知音乐是iOS的重要组成播放,无论是iPod.iTouch.iPhone还是iPad都可以在iTunes购买音乐或添加本地音乐到音乐 库中同步到你的iOS设备.在MediaPlayer.fram ...

  2. iOS8 用AVAudioPlayer播放音乐(Swift)

    AVAudioPlayer 类提供了播放音频文件的功能,在本次教程中,我们将对一个音乐文件进行播放暂停和停止操作,此外还会显示标题和播放时间.本次教程使用iOS8和Xcod6.3.1 打开Xcode创 ...

  3. pcDuino-V2利用madplay播放音乐

    在pcDuino的UBUNTU系统下,打开控制台,利用apt-get来下载madplay软件. sudo apt-get install madplay 播放音乐: madplay xxx.mp3 x ...

  4. matlab播放音乐

    最近在做计算,写了一些matlab代码,脑壳还疼,所以决定发挥一下逗B精神,写一个程序玩一下. 想了想,既然写代码的时候喜欢听歌,而且我的电脑打开网易音乐的速度巨慢(不知道为什么..),那些一个程序直 ...

  5. go语言让windows发出声音,或者播放音乐

    go语言让windows发出声音,或者播放音乐的例子:会发出alert警告的声音 ( 这是我应群员的求助写的, 如果你需要了解其中的调用原理或过程 或更多go语言调用win32api的资料,加群: 2 ...

  6. Inno调用dll --- 实现背景播放音乐

    Inno 播放音乐可以调用系统api函数mciSendString来实现,而mciSendString函数存在C:\Windows\System32\winmm.dll中,因此最终只要成功从该dll文 ...

  7. 【分享】4412开发板ubuntu 12.0.4播放音乐没有声音解决方法

    转自迅为论坛:http://bbs.topeetboard.com 准备工作 1.下载 vim 在命令行上输入 apt-get install vim 下载 vim 2.输入 vim /etc/hos ...

  8. 在Linux终端命令行下播放音乐的命令(Ubuntu)

    现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小 ...

  9. C# 调用系统winmm.dll 播放音乐wav mp3

    using System.Runtime.InteropServices;//放wav public partial class frmMain : Form { 系统放 播放音乐 wav mp3 [ ...

随机推荐

  1. ORACLE 11g 用Duplicate恢复Data Guard 备库详细过程

    1.先查找备库控制文件路径 先在备库上找出控制文件的路径,通过和主库一样,不过为了以防万一,还是check为好. SQL>  select name from v$controlfile; NA ...

  2. 用视频编辑软件打不开jpg格式的图片的解决方法

    有时候我们把PSD.JPG等图片导入到素材库中会发现EDIUS视频编辑软件根本就不支持,显示黑屏状态.可是当我们把图片导入EDIUS NX支持下的premierepro里却能够正常显示.这是什么原因呢 ...

  3. playframework1.x的eclipse插件开源-playtools

    playtools介绍 playframework(1.2.x)是一款令人兴奋的java restful风格的web框架,使用它已经有两年多. 其中结合eclipse开发项目往往要不断进行cmd窗口切 ...

  4. oracle的高可用与负载均衡

    浏览了一下Oracle官方的网页以及非官方的ppt,简单了解了一下Oracle提供的高可用方案.1. RACRAC,  Real Application Clusters多个Oracle服务器组成一个 ...

  5. get跟post编码--转

    1.Get是用来从服务器上获得数据(没有请求体),而Post是用来向服务器上传递数据(包含请求体). 2.Get将表单中数据的按照variable=value的形式,添加到action(服务)所指向的 ...

  6. HDP2.4安装(五):集群及组件安装

    HDP(Hortonworks Data Platform)是hortworks推出的100%开源的hadoop发行版本,以YARN 作为其架构中心,包含pig.hive.phoniex.hbase. ...

  7. [mysql] mysql表名忽略大小写

    首先查看mysql是否区分大小写: 今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 后来请教了一个老师才搞定,原来 ...

  8. mysql中一对一,一对多,多对多关系

    打个比方吧一个班级有很多学生,他们分别有不同的学号.一个学生对应一个学号,一个学号对应一个学生:这里学生和学号的关系就是一对一.一个班级有很多学生,这个班级只有一个班主任.一个班主任对应多个学生,多个 ...

  9. openstack(liberty): 简单网络连接图

    openstack起初的网络部分是和计算核心nova合在一起的,后来被拆分出来,独立成为一个模块, 现在名为Neutron. 本博文是学习记录,记录的是基于GRE tunnel技术的neutron和计 ...

  10. PHP使用1个crontab管理多个crontab任务

    http://www.binarytides.com/php-manage-multiple-cronjobs-with-a-single-crontab-entry/ In many php app ...