1

我有一个 iOS 应用程序,它的工作原理如下:

第一个视图 3 个链接到不同视图的按钮,每个都有自己的音频文件

想象用户打开一个视图,并开始播放音频文件。当他们在应用程序中导航时,音频文件仍然可以播放,这很好,我很满意。

但是,如果用户随后打开第二个音频文件并按下播放,它会在第一个文件的顶部播放,因此 2 个音频一起播放。

我如何告诉代码如果按下另一个播放按钮它应该停止正在播放的第一个音频文件?

我正在使用 AVFoundation 框架来执行此操作

代码如下:

NSString *stringPath = [[NSBundle mainBundle]pathForResource:@"01" ofType:@"MP3"];
NSURL *url = [NSURL fileURLWithPath:stringPath];

NSError *error;

avPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];

[avPlayer setNumberOfLoops:2];

[avPlayer setVolume:self.sliderVolumeOutlet.value];

[NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(updateMyProgress) userInfo:nil repeats:YES];









-(void)updateMyProgress
{
    float progress = [avPlayer currentTime]/[avPlayer duration];
    self.myProgressView.progress = progress;
}

- (IBAction)sliderVolumeAction:(id)sender {
    UISlider *mySlider = sender;
    [avPlayer setVolume:mySlider.value];
}

- (IBAction)stopButton:(id)sender {
    [avPlayer stop];
    [avPlayer setCurrentTime:0];
}

- (IBAction)pauseButton:(id)sender {
    [avPlayer pause];
}


- (IBAction)playButton:(id)sender {

    [avPlayer play];

}

- (IBAction)backButtonEvent:(id)sender {
    [self dismissViewControllerAnimated:YES completion:NULL];
}
4

2 回答 2

0

您可以通过如果它正在播放来检查它是否正在播放上一首曲目,if ([AVPlayer rate] != 0.0) 那么您可以将下一首曲目添加到队列中,或者使用此功能将当前曲目替换为新曲目- (void)replaceCurrentItemWithPlayerItem:(AVPlayerItem *)item

于 2013-10-01T15:52:55.380 回答
0

也许创建某种playSound功能会更适合于此。像这样的东西:

- (void)playSoundWithFileName:(NSString *)fileName andExtension:(NSString *)extension {
    NSString *stringPath = [[NSBundle mainBundle]pathForResource:fileName ofType:extension];
    NSURL *url = [NSURL fileURLWithPath:stringPath];

    NSError *error;

    if (avPlayer) {
        [avPlayer stop];
        avPlayer = nil;
    }

    avPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];

    if (error)
        NSLog(@"Error");
    else {
        [avPlayer setNumberOfLoops:2];
        [avPlayer setVolume:self.sliderVolumeOutlet.value];
        [avPlayer play];
    }
}

利用:

[self playSoundWithFileName:@"01" andExtension:@"MP3"];
[NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(updateMyProgress) userInfo:nil repeats:YES];

-(void)playSoundWithFileName在您想播放另一种声音时拨打电话。

或者,如果您正在使用该AVPlayer课程:

- (void)playSoundWithFileName:(NSString *)fileName andExtension:(NSString *)extension {
    NSString *stringPath = [[NSBundle mainBundle]pathForResource:fileName ofType:extension];
    NSURL *url = [NSURL fileURLWithPath:stringPath];
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];


    if (avPlayer)
        [avPlayer replaceCurrentItemWithPlayerItem:item];
    else
        avPlayer = [AVPlayer playerWithPlayerItem:item];

        [avPlayer setVolume:self.sliderVolumeOutlet.value];
        [avPlayer play];
}

尽管后者不允许您设置多个循环。

于 2013-10-01T18:23:54.053 回答