如何使用AVAudioPlayer连续播放多个音频文件?

时间:2011-11-12 02:56:28

标签: ios avaudioplayer

我的应用程序中有5首歌曲,我想用AVAudioPlayer一个接一个地播放。

有这方面的例子吗?我怎么能做到这一点?

非常感谢任何示例代码!

谢谢!

4 个答案:

答案 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并提出一个更复杂的解决方案。