Как воспроизвести несколько звуков?

Мне нужно воспроизвести несколько звуковых файлов. У меня есть следующий код:

Мой .h класс:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

@interface ViewController : UIViewController {
    AVAudioPlayer *musicPlayer;
}

- (IBAction)music1:(id)sender;
- (IBAction)music2:(id)sender;
- (IBAction)music3:(id)sender;
- (IBAction)music4:(id)sender;
- (IBAction)music5:(id)sender;

@end

Мой .m файл

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)music1:(id)sender {

    if(musicPlayer.isPlaying)
    {
        [musicPlayer pause];
        return;
    }
    if(musicPlayer == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music1" ofType:@"wav" ]];
        musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [musicPlayer play];
}

- (IBAction) music2:(id)sender {

    if(musicPlayer.isPlaying)
    {
        [musicPlayer pause];
        return;
    }
    if(musicPlayer == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music2" ofType:@"wav" ]];
        musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [musicPlayer play];
}

- (IBAction) music3:(id)sender {

    if(musicPlayer.isPlaying)
    {
        [musicPlayer pause];
        return;
    }
    if(musicPlayer == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music3" ofType:@"wav" ]];
        musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [musicPlayer play];
}

- (IBAction) music4:(id)sender {

    if(musicPlayer.isPlaying)
    {
        [musicPlayer pause];
        return;
    }
    if(musicPlayer == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music4" ofType:@"wav" ]];
        musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [musicPlayer play];
}

- (IBAction) music5:(id)sender {

    if(musicPlayer.isPlaying)
    {
        [musicPlayer pause];
        return;
    }
    if(musicPlayer == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music5" ofType:@"wav" ]];
        musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [musicPlayer play];
}
@end

Но этот код не работает: воспроизводится только один музыкальный файл. Другого файла нет.

Также есть пример:
Играет Music1.

Нажимаю кнопку Музыка2 -> Музыка1 конец, Музыка2 старт.

Как мне изменить мой код?


person Axapta    schedule 16.02.2013    source источник


Ответы (1)


Вам нужен AVAudioPlayer для каждого звука:

.h:

     #import <UIKit/UIKit.h>
            #import <AVFoundation/AVFoundation.h>
            #import <AudioToolbox/AudioToolbox.h>

            @interface ViewController : UIViewController {
                AVAudioPlayer *musicPlayer1;
                AVAudioPlayer *musicPlayer2;
                AVAudioPlayer *musicPlayer3;
                AVAudioPlayer *musicPlayer4;
                AVAudioPlayer *musicPlayer5;

NSMutableArray playingMusicArray;

            }

            - (IBAction)music1:(id)sender;
            - (IBAction)music2:(id)sender;
            - (IBAction)music3:(id)sender;
            - (IBAction)music4:(id)sender;
            - (IBAction)music5:(id)sender;

        @end

.m:

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    playingMusicArray = [[NSMutableArray alloc] init];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



- (void)stopPlayingMusic {
    for(AVAudioPlayer *audioPlayer in playingMusicArray)
    {
        [audioPlayer pause];
        [playingMusicArray removeObject:audioPlayer];


    }
}
- (IBAction)music1:(id)sender {


    [self stopPlayingMusic];
    if(musicPlayer1 == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music1" ofType:@"wav" ]];
        musicPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [playingMusicArray addObject:musicPlayer1];
    [musicPlayer1 play];
}

- (IBAction) music2:(id)sender {

    [self stopPlayingMusic];
    if(musicPlayer2 == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music2" ofType:@"wav" ]];
        musicPlayer2 = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [playingMusicArray addObject:musicPlayer2];

    [musicPlayer2 play];
}

- (IBAction) music3:(id)sender {

    [self stopPlayingMusic];

    if(musicPlayer3 == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music3" ofType:@"wav" ]];
        musicPlayer3 = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [playingMusicArray addObject:musicPlayer3];

    [musicPlayer3 play];
}

- (IBAction) music4:(id)sender {

    [self stopPlayingMusic];

    if(musicPlayer4 == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music4" ofType:@"wav" ]];
        musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [playingMusicArray addObject:musicPlayer4];

    [musicPlayer4 play];
}

- (IBAction) music5:(id)sender {

    [self stopPlayingMusic];

    if(musicPlayer5 == nil)
    {
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music5" ofType:@"wav" ]];
        musicPlayer5 = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    [playingMusicArray addObject:musicPlayer5];

    [musicPlayer5 play];
}
@end
person Mikhail Viceman    schedule 16.02.2013
comment
И тогда вы в конечном итоге создаете 25 аудиоплееров. Я уверен, вы имели в виду, что вам нужно пять AVAudioPlayer: по одному на каждый звук. - person ; 16.02.2013
comment
Большое спасибо .. Я пропустил обзор :) Какой второй ответ на мой вопрос? Также есть пример: играет Music1. Нажимаю кнопку Музыка2 -> Музыка1 конец, Музыка2 старт. Как мне нужно написать код? - person Axapta; 16.02.2013
comment
Ищите мой обновленный ответ. Это не лучшее решение, но оно должно работать - person Mikhail Viceman; 16.02.2013
comment
к сожалению, это не работает. Играет музыка1, нажимаю кнопку музыка2, музыка1 не останавливается. - person Axapta; 16.02.2013
comment
Как ты начал играть в Music1? - person Mikhail Viceman; 18.02.2013
comment
Я нажимаю кнопку «Музыка1», воспроизводится звук «Музыка1». Нажимаю кнопку «Музыка2», воспроизводится звук «Музыка2», но не останавливается звук «Музыка1». Я хочу, чтобы Music2 звучал при запуске, остановил звук Music1. - person Axapta; 18.02.2013
comment
Попробуйте следующее: измените NSArray на NSMutableArray в вашем .m-файле (или возьмите мой обновленный код). - person Mikhail Viceman; 18.02.2013