2014-12-28 2 views
1

У меня есть набор UIButtons. Каждый раз, когда я нажимаю кнопку, звучит звук. Проблема. Когда вы нажимаете одну кнопку и звук сзади для воспроизведения, когда вы нажимаете вторую кнопку, звук, идущий от первой кнопки, останавливается.Воспроизведение нескольких звуков при использовании AVAudioPlayer

Этот вопрос задан в миллион раз. Решением всегда является создание нового экземпляра AVAudioPlayer каждый раз. Я пробовал это, но безрезультатно. Я прочитал документы, прочитал каждый вопрос о StackOverflow, связанный с этим, и не повезло. Когда я использую SystemSoundID, они играют одновременно каждый раз ... Но я должен пожертвовать возможностью регулировки громкости. Вот код, я работаю с:

NSString *soundOne = [[NSUserDefaults standardUserDefaults] valueForKey:senderString]; 

    NSURL *url = [NSURL URLWithString:[soundOne stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 

    switch ([sender tag]) { 

     case 1: 
      [_audioPlayer prepareToPlay]; 
      [_audioPlayer play]; 
      NSLog(@"Playing: %@", soundOne); 
      break; 

     case 2: 
      [_audioPlayer prepareToPlay]; 
      [_audioPlayer play]; 
      NSLog(@"Playing: %@", soundOne); 
      break; 
} 

ответ

3

Проблема заключается в том, что ваш код, делая новый аудиоплеер, также разрушает старый аудиоплеер. У вас должно быть два аудиоплеера , существующих одновременно с, чтобы они одновременно воспроизводили два звука. Это невозможно, если у вас есть только одна переменная экземпляра _audioPlayer.

+0

Так мне нужно добавить '_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: ошибка URL: nil]; 'в каждом случае? – John

+0

Попробуйте _audioPlayer1 и _audioPlayer2 вместо этого –

+0

Я думаю, что здесь необходимо базовое понимание того, что такое переменная. Вы не можете поставить две туфли в одну коробку для обуви ... – matt

1

Ответ от matt Ответ, воспроизводящий второй звук, разрушает первый.

Рассмотрим это:

x = 3 

Мы просто установить x равным 3. Теперь нам нужно сохранить другой номер, 4. Теперь мы имеем это:

x = 4 

Подождите, мы просто назначены x быть 4. Мы забыли 3. Нам нужна вторая переменная, которая должна содержать 3. Почему не y?

y = 3 

Здесь мы идем. Теперь у нас есть x = 4 и y = 3. Две переменные, содержащие два значения.

Это относится к экземплярам аудиоплееров. Независимо от того, является ли кнопка первой или второй, аудио-плеер сбрасывается, чтобы быть экземпляром любого звука, который вы хотите воспроизвести. Итак, что происходит, аудиоплеер забывает первый звук и играет второй. Это как сброс x будет 4, а не 3.

Как и в приведенном выше решении, вам понадобится вторая переменная.


Замените это в файле .h ...

@property AVAudioSession* audioPlayer; 

с ...

@property AVAudioSession* audioPlayer1; 
@property AVAudioSession* audioPlayer2; 

Могу ли я заметить также, в вашем коде, вы всегда повторно -инициализировать аудиоплеер каждый раз, когда воспроизводится звук, и у вас есть только один звук для воспроизведения. В файле .m скопируйте/вставьте эту функцию или добавьте соответствующий код в функцию init.

-(instancetype)init { 
    self = [super init]; 
    if (self) { 
     self->_audioPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:[[[NSUserDefaults standardUserDefaults] valueForKey:Sound1] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]]; 
     self->_audioPlayer2 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:[[[NSUserDefaults standardUserDefaults] valueForKey:Sound2] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]]; 
     [self->_audioPlayer1 prepareToPlay]; 
     [self->_audioPlayer2 prepareToPlay]; 
    } 
} 

И, в файле .h, добавьте:

#define Sound1 @"your first key name" 
#define Sound2 @"your second key name" 

Наконец, вы можете включить код в функции только это:

NSLog(@"Playing sound with sender tag: %i", [sender tag]); 
switch ([sender tag]) { 
    case 1: 
    { 
     [_audioPlayer1 play]; 
     break; 
    } 
    case 2: 
    { 
     [_audioPlayer2 play]; 
     break; 
    } 
    default: 
    { 
     break; 
    } 
} 
Смежные вопросы