Play/Pause/Stop 本地存储的多个音频文件
Play/Pause/Stop multiple audio file which are stored locally
我有 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];
}
一切正常,我面临的问题是暂停按钮。当我点击暂停按钮时,它停止播放。然后当我点击播放按钮时,它会从我暂停的同一个地方播放。到这里一切看起来都很好。但是在暂停后播放音频队列时,它会播放音频队列的剩余部分,然后再次播放整个音频队列。不知道如何解决。为什么它再次播放整个音频队列?
有人知道吗?
提前致谢!
整个音频队列正在再次播放,因为每次单击 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];
}
因为你在 click_Play
中再次初始化 AVPlayerItem
。
如果 AVPlayerItem
没有分配,请取一个 bool
值并插入 arrPlayData
。
我有 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];
}
一切正常,我面临的问题是暂停按钮。当我点击暂停按钮时,它停止播放。然后当我点击播放按钮时,它会从我暂停的同一个地方播放。到这里一切看起来都很好。但是在暂停后播放音频队列时,它会播放音频队列的剩余部分,然后再次播放整个音频队列。不知道如何解决。为什么它再次播放整个音频队列?
有人知道吗? 提前致谢!
整个音频队列正在再次播放,因为每次单击 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];
}
因为你在 click_Play
中再次初始化 AVPlayerItem
。
如果 AVPlayerItem
没有分配,请取一个 bool
值并插入 arrPlayData
。