1

私は次のように動作するiOSアプリを持っています:

最初のビュー 異なるビューにリンクする 3 つのボタン。それぞれに独自のオーディオ ファイルがあります。

ユーザーが 1 つのビューを開いて、オーディオ ファイルの再生を開始したとします。彼らがアプリをナビゲートするとき、オーディオファイルはまだ再生されますが、これは問題ありません。私はそれに満足しています.

ただし、ユーザーが 2 番目のオーディオ ファイルを開いて再生を押すと、最初のオーディオ ファイルの上に重ねて再生されるため、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 に答える