【问题标题】:Play/Pause/Stop multiple audio file which are stored locally播放/暂停/停止本地存储的多个音频文件
【发布时间】:2016-03-08 10:20:15
【问题描述】:

我有 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];
}

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

有人知道吗? 提前致谢!

【问题讨论】:

    标签: ios objective-c avqueueplayer


    【解决方案1】:

    整个音频队列再次播放,因为每次点击 click_Play 时,您都在插入来自 arrPlayData 的项目。

    因此,在 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];
    }
    

    【讨论】:

      【解决方案2】:

      因为你在click_Play 中再次初始化AVPlayerItem。 如果AVPlayerItem 未分配,请取一个bool 值并插入arrPlayData

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        相关资源
        最近更新 更多