我的应用程序中有5首歌曲,我想用AVAudioPlayer一个接一个地播放。
有这方面的例子吗?我怎么能做到这一点?
非常感谢任何示例代码!
谢谢!
答案 0 :(得分:14)
AVQueuePlayer适用于这种情况。
AVQueuePlayer是AVPlayer的子类,用于按顺序播放多个项目。
答案 1 :(得分:9)
而不是AVAudioPlayer,您可以使用更符合此用例的AVQueuePlayer,如Ken所建议的那样。 以下是您可以使用的一些代码:
@interface AVSound : NSObject
@property (nonatomic, retain) AVQueuePlayer* queuePlayer;
- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType;
- (void)playQueue;
@end
@implementation AVSound
- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType
{
// Path to the audio file
NSString *path = [[NSBundle mainBundle] pathForResource:pathForResource ofType:ofType];
// If we can access the file...
if ([[NSFileManager defaultManager] fileExistsAtPath:path])
{
AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:path]];
if (_queuePlayer == nil) {
_queuePlayer = [[AVQueuePlayer alloc] initWithPlayerItem:item];
}else{
[_queuePlayer insertItem:item afterItem:nil];
}
}
}
- (void)playQueue
{
[_queuePlayer play];
}
@end
然后使用它: 在您的界面文件中:
@property (strong, nonatomic) AVSound *pageSound;
在您的实施文件中:
- (void)addAudio:(Book*)book pageNum:(int)pageNum
{
NSString *soundFileEven = [NSString stringWithFormat:@"%02d", pageNum-1];
NSString *soundPathEven = [NSString stringWithFormat:@"%@_%@", book.productId, soundFileEven];
NSString *soundFileOdd = [NSString stringWithFormat:@"%02d", pageNum];
NSString *soundPathOdd = [NSString stringWithFormat:@"%@_%@", book.productId, soundFileOdd];
if (_pageSound == nil) {
_pageSound = [[AVSound alloc]init];
_pageSound.player.volume = 0.5;
}
[_pageSound clearQueue];
[_pageSound addToPlaylist:soundPathEven ofType:@"mp3"];
[_pageSound addToPlaylist:soundPathOdd ofType:@"mp3"];
[_pageSound playQueue];
}
HTH
答案 2 :(得分:1)
对于您想制作的每首歌曲,只需制作一首AVPlayer
。
NSURL *url = [NSURL URLWithString:pathToYourFile];
AVPlayer *audioPlayer = [[AVPlayer alloc] initWithURL:url];
[audioPlayer play];
玩家结束时可以获得通知。在设置播放器时检查AVPlayerItemDidPlayToEndTimeNotification
:
audioPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[audioPlayer currentItem]];
这会阻止玩家在结束时暂停。
通知中的:
- (void)playerItemDidReachEnd:(NSNotification *)notification
{
// start your next song here
}
您可以在收到当前播放歌曲完成的通知后立即开始播放下一首歌曲。维护一些在选择器调用中持久的计数器。这样使用counter % [songs count]
将为您提供无限循环播放列表:)
不要忘记在释放播放器时取消注册通知。
答案 3 :(得分:1)
不幸的是,AVAudioPlayer只能播放一个文件。要播放两个文件,您必须终止AVAudioPlayer的第一个实例并再次重新创建它(可以使用- (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError
启动它)。这种方法的问题在于,第一个文件完成播放和第二个文件开始播放之间存在轻微的延迟。如果你想摆脱这种延迟,你必须深入研究Core Audio并提出一个更复杂的解决方案。