多媒体应用开发:音频播放与管理全解析
立即解锁
发布时间: 2025-08-25 01:32:33 阅读量: 3 订阅数: 16 


iOS 6开发实战指南:从入门到精通
# 多媒体应用开发:音频播放与管理全解析
## 1. 音频录制与播放基础
在音频应用开发中,实现音频的录制和播放是基础功能。当音频播放完成时,播放按钮的标题需要重置。以下是相应的代理方法:
```objc
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
[self.playButton setTitle:@"Play" forState:UIControlStateNormal];
}
```
同时,还需要处理中断情况,如电话或短信干扰。以下是处理音频播放和录制中断的方法:
```objc
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags
{
if (flags == AVAudioSessionInterruptionOptionShouldResume)
{
[player play];
}
}
- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder withOptions:(NSUInteger)flags
{
if (flags == AVAudioSessionInterruptionOptionShouldResume)
{
[recorder record];
}
}
```
通过这些方法,我们可以确保音频应用在遇到中断后能正确恢复播放或录制。
## 2. 访问音乐库
除了处理项目中自带的音频文件,还可以通过访问用户的音乐库来获取更多音频资源。以下是实现这一功能的详细步骤:
### 2.1 创建新项目并引入框架
创建一个新项目,并将其与 Media Player 框架链接,同时在视图控制器中添加导入语句:
```objc
#import <MediaPlayer/MediaPlayer.h>
```
### 2.2 设置基本音乐播放器
设置视图以实现基本音乐播放器的功能,需要创建以下控件的出口和动作:
| 控件类型 | 出口名称 | 动作名称 | 动作触发事件 |
| ---- | ---- | ---- | ---- |
| 标签 | infoLabel | 无 | 无 |
| 滑块 | volumeSlider | updateVolume | Value Changed |
| 按钮 | playButton | playTapped | 点击 |
| 按钮 | 无 | addItems | Touch Up Inside |
| 按钮 | 无 | prevTapped | 点击 |
| 按钮 | 无 | nextTapped | 点击 |
同时,在头文件中定义两个属性:
```objc
@property (strong, nonatomic) MPMusicPlayerController *player;
@property (strong, nonatomic) MPMediaItemCollection *myCollection;
```
并使视图控制器成为 `MPMediaPickerController` 的代理:
```objc
@interface ViewController : UIViewController<MPMediaPickerControllerDelegate>
```
头文件的完整代码如下:
```objc
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
@interface ViewController : UIViewController<MPMediaPickerControllerDelegate>
@property (weak, nonatomic) IBOutlet UILabel *infoLabel;
@property (weak, nonatomic) IBOutlet UISlider *volumeSlider;
@property (weak, nonatomic) IBOutlet UIButton *playButton;
@property (strong, nonatomic) MPMediaItemCollection *myCollection;
@property (strong, nonatomic) MPMusicPlayerController *player;
- (IBAction)addItems:(id)sender;
- (IBAction)prevTapped:(id)sender;
- (IBAction)playTapped:(id)sender;
- (IBAction)nextTapped:(id)sender;
- (IBAction)updateVolume:(id)sender;
@end
```
### 2.3 初始化视图
在 `viewDidLoad` 方法中进行初始化设置:
```objc
- (void)viewDidLoad
{
[super viewDidLoad];
self.infoLabel.text = @". . .";
self.player = [MPMusicPlayerController applicationMusicPlayer];
[self setNotifications];
[self.player beginGeneratingPlaybackNotifications];
[self.player setShuffleMode:MPMusicShuffleModeOff];
self.player.repeatMode = MPMusicRepeatModeNone;
self.volumeSlider.value = self.player.volume;
}
```
需要注意的是,`MPMusicPlayerController` 有两个重要的类方法:`applicationMusicPlayer` 和 `iPodMusicPlayer`。`applicationMusicPlayer` 返回特定于应用的音乐播放器,应用进入后台后可能无法播放;`iPodMusicPlayer` 允许在后台持续播放,但需要处理可能已有的正在播放的项目。
### 2.4 处理通知
为了及时响应播放状态和当前播放歌曲的变化,需要注册通知:
```objc
-(void)setNotifications
{
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter
addObserver: self
selector: @selector(handleNowPlayingItemChanged:)
name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object: self.player];
[notificationCenter
addObserver: self
selector: @selector(handlePlaybackStateChanged:)
name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
object: self.player];
[notificationCenter
addObserver: self
selector: @selector(handleVolumeChangedFromHardware:)
name: @"AVSystemController_SystemVolumeDidChangeNotification"
object: nil];
}
```
以下是处理不同通知的方法:
```objc
-(void)handleVolumeChangedFromHardware:(id)sender
{
[self.volumeSlider setValue:self.player.volume animated:YES];
}
- (void) handlePlaybackStateChanged: (id) notification
{
MPMusicPlaybackState playbackState = [self.player playbackState];
if (playbackState == MPMusicPlaybackStateStopped)
{
[self.playButton setTitle:@"Play" forState:UIControlStateNormal];
}
else if (playbackState == MPMusicPlaybackStatePaused)
{
[self.playButton setTitle:@"Play" forState:UIControlStateNormal];
}
else if (playbackState == MPMusicPlaybackStatePlaying)
{
[self.playButton setTitle:@"Pause" forState:UIControlStateNormal];
}
}
- (void) handleNowPlayingItemChanged: (id) notification
{
MPMediaItem *currentItemPlaying = [self.player nowPlayingItem];
if (currentItemPlaying)
{
NSString *info = [NSString stringWithFormat:@"%@ - %@",
[currentItemPlaying valueForProperty:MPMediaItemPropertyTitle],
[currentItemPlaying valueForProperty:MPMediaItemPropertyArtist]];
self.infoLabel.text = info;
}
else
{
self.infoLabel.text = @". . .";
}
}
```
### 2.5 选择媒体播放
使用 `MPMediaPickerController` 类来添加音乐到播放列表:
```objc
- (IBAction)addItems:(id)sender
{
MPMediaPickerController *picker =
[[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
picker.delegate = self;
picker.allowsPickingMultipleItems = YES;
picker.prompt = NSLocalizedString (@"Add songs to play",
"Prompt in media item picker");
[self presentViewController:picker animated:YES completion:NULL];
}
```
同时,实现代理方法来处理媒体选择的取消和成功情况:
```objc
-(void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
[self dismissViewControllerAnimated:YES completion:NULL];
}
-(void)mediaPicker:(MPMediaPickerController *)mediaPicker
didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
[self updateQueueWithMediaItemCollection:mediaItemCollection];
[self dismissViewControllerAnimated:YES completion:NULL];
}
```
以下是更新播放队列的方法:
```objc
-(void)updateQu
```
0
0
复制全文
相关推荐










