播放/暂停/停止本地存储的多个音频文件

时间:2016-03-08 10:20:16

标签: ios objective-c avqueueplayer

我有20个音轨,它们存储在我的项目中。

我想按顺序播放所有文件。为此,我使用了AVQueuePlayer。请查看以下代码以供参考。

声明: -

@interface ViewController ()
{
    AVAudioPlayer *player;
    NSMutableArray *arrPlayData;
    AVPlayerItem *item;
}
@property (nonatomic, retain) AVQueuePlayer *queuePlayer;

按钮点击如下,

-(IBAction)click_Play:(id)sender {

            for (int j = 0; j < arrPlayData.count; j++) {
            path =[[NSBundle mainBundle] pathForResource:[[arrPlayData objectAtIndex:j] valueForKey:@"AudioName"] ofType:@"wav"];
            item = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:path]];
                 if (_queuePlayer == nil) {
                     _queuePlayer = [[AVQueuePlayer alloc] initWithPlayerItem:item];
                 } else{
                     [_queuePlayer insertItem:item afterItem:nil];
                 }
            }
        [_queuePlayer setVolume:1.0];
        [_queuePlayer play];
}

然后在暂停按钮上我写了下面的代码,

-(IBAction)click_Pause:(id)sender {
    [_queuePlayer pause];
}

在停止按钮上,我写了下面的代码,

-(IBAction)click_Stop:(id)sender {
    [_queuePlayer removeAllItems];
}

一切运作良好,我面临的问题是PAUSE按钮。当我点击暂停按钮时它停止播放。然后,当我点击播放按钮时,它会从我暂停它的同一个地方播放。到这里一切都很好看。但是在暂停后播放音频队列时,它会播放音频队列的剩余部分,然后再次播放整个音频队列。不知道如何解决它。为什么它再次播放整个音频队列?

有人有想法吗? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

整个音频队列再次播放,因为每次点击arrPlayData时都会从click_Play插入项目。

因此,在click_Play中检查项目的数量并相应地处理,如果项目_queuePlayer的数量为零,则仅插入项目。

@interface ViewController ()
{
  BOOL FromPause;
}

-(IBAction)click_Stop:(id)sender {
    [_queuePlayer removeAllItems];
}

-(IBAction)click_Pause:(id)sender {
    [_queuePlayer pause];
    FromPause=YES;

}

-(IBAction)click_Play:(id)sender {

            for (int j = 0; j < arrPlayData.count; j++) {
            path =[[NSBundle mainBundle] pathForResource:[[arrPlayData objectAtIndex:j] valueForKey:@"AudioName"] ofType:@"wav"];
            item = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:path]];
                 if (_queuePlayer == nil) {
                     _queuePlayer = [[AVQueuePlayer alloc] initWithPlayerItem:item];
                 } else{
                     if(FromPause){
                      //don't add again
                        FromPause=NO;
                     }
                     else{
                          [_queuePlayer insertItem:item afterItem:nil];
                     }
                 }
            }
        [_queuePlayer setVolume:1.0];
        [_queuePlayer play];
}

答案 1 :(得分:1)

由于您在AVPlayerItem中再次初始化click_Play。 如果bool未分配,请带一个arrPlayData值并插入AVPlayerItem