【问题标题】:Multiple audio files playing at once in iOS App在 iOS App 中一次播放多个音频文件
【发布时间】:2013-10-01 15:44:05
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c iphone xcode


    【解决方案1】:

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

    【讨论】:

    • 谢谢,你能告诉我代码在我的文件中的样子吗?我对此有点陌生,所以对业余爱好者感到抱歉,哈哈-感谢帮助伙伴
    【解决方案2】:

    也许创建某种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];
    }
    

    虽然后者不允许您设置多个循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多