iPhone播放音乐

简介: 来源:http://blog.csdn.net/htttw/article/details/7842295 iPhone播放音乐 今天我们简要介绍如何在iPhone中播放音乐: 强烈建议你参考官方文档(需要登录): http://developer.

 

来源: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.   
  9. #import <UIKit/UIKit.h>  
  10. #import <AVFoundation/AVFoundation.h>  
  11.   
  12. @interface MusicPlayerAppDelegate : NSObject <UIApplicationDelegate>  
  13. {  
  14.     UIWindow * window;  
  15.       
  16.     IBOutlet UIButton * btnPlay;  
  17.     IBOutlet UILabel * labelVolume;  
  18.     IBOutlet UILabel * labelCurrentTime;  
  19.     IBOutlet UISlider * sliderCurrentTime;  
  20.       
  21.     NSTimer * playTimer;  
  22.       
  23.     AVAudioPlayer * player;  
  24. }  
  25.   
  26.   
  27. @property (nonatomic, retain) IBOutlet UIWindow * window;  
  28. @property (nonatomic, retain) IBOutlet UIButton * btnPlay;  
  29. @property (nonatomic, retain) IBOutlet UILabel * labelVolume;  
  30. @property (nonatomic, retain) IBOutlet UILabel * labelCurrentTime;  
  31. @property (nonatomic, retain) IBOutlet UISlider * sliderCurrentTime;  
  32.   
  33.   
  34. -(IBAction)soundStartOrPause:(id)sender;  
  35. -(IBAction)soundStop:(id)sender;  
  36. -(IBAction)volumeChanged:(id)sender;  
  37. -(IBAction)currentTimeChanged:(id)sender;  
  38.   
  39. -(void)updateSoundAt:(float)percent;  
  40. -(void)updateCurrentTime;  
  41. -(void)initPlayer;  
  42.   
  43.   
  44. @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.   
  9. #import "MusicPlayerAppDelegate.h"  
  10.   
  11. @implementation MusicPlayerAppDelegate  
  12.   
  13. @synthesize window;  
  14. @synthesize btnPlay;  
  15. @synthesize labelVolume;  
  16. @synthesize labelCurrentTime;  
  17. @synthesize sliderCurrentTime;  
  18.   
  19.   
  20. #pragma mark -  
  21. #pragma mark Application lifecycle  
  22.   
  23.   
  24. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  25. {  
  26.       
  27.     //初始化AVAudioPlayer  
  28.     [self initPlayer];  
  29.       
  30.     [window makeKeyAndVisible];  
  31.       
  32.     return YES;  
  33. }  
  34.   
  35.   
  36. -(void)initPlayer  
  37. {  
  38.     NSString * path = [[NSBundle mainBundle] pathForResource:@"北京欢迎你" ofType:@"mp3"];  
  39.       
  40.     //判断是否找到该音乐文件    
  41.     if (path)  
  42.     {  
  43.         NSLog(@"Init sound");  
  44.           
  45.         //用path路径初始化AVAudioPlayer  
  46.         player = [[AVAudioPlayer alloc]initWithContentsOfURL:[[NSURL alloc]initFileURLWithPath:path]error:nil];  
  47.           
  48.         //初始化播放器    
  49.         [player prepareToPlay];    
  50.           
  51.         //设置播放循环次数:如果numberOfLoops为负数 音频文件就会一直循环播放下去    
  52.         player.numberOfLoops = -1;    
  53.           
  54.         //设置音频音量:volume的取值范围在[0.0f, 0.1f]之间    
  55.         player.volume = 0.5f;  
  56.           
  57.         //将当前播放进度调为0  
  58.         [self updateSoundAt:0.0f];  
  59.     }  
  60. }  
  61.   
  62.   
  63. -(void)updateSoundAt:(float)percent  
  64. {  
  65.     float atTime = (player ? player.duration * percent : 0.0f);  
  66.       
  67.     NSString * time = [NSString stringWithFormat:@"%d", (int)atTime];  
  68.     labelCurrentTime.text = time;  
  69.       
  70.     sliderCurrentTime.value = percent;  
  71. }  
  72.   
  73.   
  74. -(IBAction)soundStartOrPause:(id)sender  
  75. {  
  76.     //点击Start按钮后开始播放音乐    
  77.     if(player)     
  78.     {  
  79.         UIButton * btn = (UIButton *)sender;  
  80.           
  81.         if(![player isPlaying])     
  82.         {  
  83.             NSLog(@"Start sound");  
  84.               
  85.             [player play];  
  86.             [btn setTitle:@"Pause" forState:UIControlStateNormal];  
  87.             if(!playTimer)  
  88.             {  
  89.                 playTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateCurrentTime) userInfo:nil repeats:YES];  
  90.             }  
  91.         }  
  92.         else  
  93.         {  
  94.             NSLog(@"Pause sound");  
  95.               
  96.             [player pause];  
  97.             [btn setTitle:@"Start" forState:UIControlStateNormal];  
  98.         }  
  99.     }    
  100. }  
  101.   
  102.   
  103. -(void)updateCurrentTime  
  104. {  
  105.     [self updateSoundAt:1.0 * player.currentTime / player.duration];  
  106. }  
  107.   
  108.   
  109.   
  110. -(IBAction)soundStop:(id)sender  
  111. {  
  112.     //停止播放声音    
  113.     if(player)  
  114.     {  
  115.         NSLog(@"Stop sound");  
  116.   
  117.         player.currentTime = 0;  
  118.         [player stop];  
  119.           
  120.         [btnPlay setTitle:@"Start" forState:UIControlStateNormal];  
  121.         [self updateSoundAt:0.0f];  
  122.     }  
  123. }    
  124.   
  125.   
  126.   
  127. -(IBAction)volumeChanged:(id)sender  
  128. {  
  129.     UISlider * slider = (UISlider *)sender;  
  130.     NSString * value = [[NSString alloc]initWithFormat:@"%d%%", (int)(slider.value * 100)];  
  131.     labelVolume.text = value;  
  132.     player.volume = slider.value;  
  133.     [value release];  
  134. }  
  135.   
  136.   
  137.   
  138. -(IBAction)currentTimeChanged:(id)sender  
  139. {  
  140.     UISlider * slider = (UISlider *)sender;  
  141.       
  142.     int time = (player ? slider.value * player.duration : 0);  
  143.       
  144.     player.currentTime = time;  
  145.       
  146.     [self updateSoundAt:slider.value];  
  147. }  
  148.   
  149.   
  150. - (void)dealloc  
  151. {  
  152.     [window release];  
  153.     [btnPlay release];  
  154.     [labelVolume release];  
  155.     [labelCurrentTime release];  
  156.     [sliderCurrentTime release];  
  157.       
  158.     [super dealloc];  
  159. }  
  160.   
  161.   
  162. @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





完成!

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

相关文章
|
人工智能 文字识别 自然语言处理
智能文字识别技术——AI赋能古彝文保护
人工智能在古彝文古籍保护方面具有巨大的潜力和意义。通过数字化、自动化和智能化的手段,可以更好地保护和传承古彝文的文化遗产,促进彝族文化的传承和发展。
|
数据可视化
如何使用四分位距方法来识别数据中的异常值?
如何使用四分位距方法来识别数据中的异常值?
|
API Android开发 Kotlin
kotlin 音频播放,多音轨同时播放,音频播放期间,可以随时设置播放速度
在Android中,`SoundPool` 适合播放短音频但不支持直接改变播放速度。若需调整播放速度,可使用 `AudioTrack` 或 `MediaPlayer`。以下是一个使用 `MediaPlayer` 实现多音轨播放并调整播放速度的简单Kotlin代码示例,特别注意,`setPlaybackParams` 方法在API 23及以上版本才能调整播放速度。别忘了在不再使用时释放 `MediaPlayer` 资源以防止内存泄漏。
|
Java Android开发 Swift
掌握安卓与iOS应用开发:技术比较与选择指南
在移动应用开发领域,谷歌的安卓和苹果的iOS系统无疑是两大巨头。它们不仅塑造了智能手机市场,还影响了开发者的日常决策。本文深入探讨了安卓与iOS平台的技术差异、开发环境及工具、以及市场表现和用户基础。通过对比分析,旨在为开发者提供实用的指导,帮助他们根据项目需求、预算限制和性能要求,做出最合适的平台选择。无论是追求高度定制的用户体验,还是期望快速进入市场,本文都将为您的开发旅程提供有价值的见解。
|
机器学习/深度学习 存储 JSON
《零基础实践深度学习》2.3 手写数字识别之数据处理
这篇文章详细介绍了手写数字识别任务中数据处理的优化方法,包括数据读取、划分数据集、生成批次数据、训练样本乱序和校验数据有效性等环节,并通过代码示例展示了如何使用飞桨框架对MNIST数据集进行有效处理以提升模型训练效果。
|
并行计算 索引 Python
讨论如何优化 DataFrame 操作,减少内存占用和提高执行速度
【5月更文挑战第19天】优化 DataFrame 操作涉及选择合适的数据类型、避免复制、使用向量化、高效迭代和设置索引。通过这些策略,如使用 `np.int8` 节省内存,直接修改列数据,利用 `itertuples`,设置分类数据类型,以及分块和并行计算,可以显著减少内存占用和提高执行速度,从而更好地处理大规模数据。实践中需结合具体情况综合运用,不断测试和优化。
615 2
|
存储 小程序
微信小程序怎样获取参数!!!
微信小程序怎样获取参数!!!
|
SQL 存储 SpringCloudAlibaba
微信数据库解析总结
微信数据库解析总结
1417 0
微信数据库解析总结
|
Shell Linux 网络安全
【Shell 命令集合 网络通讯 】Linux 即时通讯工具 talk 命令 使用指南
【Shell 命令集合 网络通讯 】Linux 即时通讯工具 talk 命令 使用指南
381 0
|
小程序
微信小程序和uni.app后台播放
微信小程序和uni.app后台播放

热门文章

最新文章