多媒体开发:音频录制、播放与音乐库访问
立即解锁
发布时间: 2025-08-25 01:29:06 阅读量: 2 订阅数: 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`:用于控制音量。
- `playButton`:播放按钮。
- **动作**:
- `addItems`:添加音乐到队列。
- `prevTapped`、`playTapped`、`nextTapped`:分别对应上一曲、播放/暂停、下一曲按钮。
- `updateVolume`:音量滑块值改变时更新音量。
在头文件中定义以下属性:
```objc
@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
```
在 `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`:可在后台持续播放,但需要处理可能已存在的播放项。
### 2.3 处理通知
为了及时响应播放状态和当前播放歌曲的变化,需要注册通知。以下是 `setNotifications` 方法的实现:
```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.4 选择媒体播放
使用 `MPMediaPickerController` 类可以方便地让用户选择音乐。以下是 `addItems` 方法的实现:
```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];
}
```
同时,实现 `MPMediaPickerControllerDelegate` 协议的两个委托方法:
```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];
}
```
`updateQueueWithMediaItemCollection` 方法用于更新媒体播放器的队列:
```objc
-(void)updateQueueWithMediaItemCollection:(MPMediaItemCollection *)collection
{
if (collection)
{
if (self.myCollection == nil)
{
self.myCollection = collection;
[self.player setQueueWithItemCollection: self.myCollection];
[self.player play];
}
else
{
BOOL wasPlaying = NO;
if (self.player.playbackState == MPMusicPlaybackStatePlaying)
{
wasPlaying = YES;
}
MPMediaItem *nowPlayingItem = self.player.nowPlayingItem;
NSTimeInterval currentPlaybackTime = self.player.currentPlaybackTime;
NSMutableArray *combinedMediaItems =
[[self.myCollection items] mutableCopy];
NSArray *newMediaItems = [collection items]
```
0
0
复制全文
相关推荐










