2010-10-02 2 views
21

Я использовал AVAudioPlayer для воспроизведения 10-секундного wav-файла, и он отлично работает. Теперь я, что остановить wav на 4-й секунде, а затем воспроизвести его снова с очень 1 сек.AVAudioPlayer останавливает звук и воспроизводит его с начала

Вот код, который я попробовал:

NSString *ahhhPath = [[NSBundle mainBundle] pathForResource:@"Ahhh" ofType:@"wav"]; 
AVAudioPlayer *ahhhhhSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:ahhhPath] error:NULL]; 

[ahhhhhSound stop]; 
[ahhhhhSound play]; 

Что я получаю, то WAV останавливается на 4 сек, но когда я бегу [XXX играть] снова, WAV продолжает играть 5-ю сек вместо игры с самого начала.

Как я могу это сделать? Любая помощь будет оценена.

+0

И для коротких звуки кажущегося симптома является то, что звук не играет во второй раз - вызов остановки и играть только вызвал звук, чтобы закончить игру, и это звучало, как вторая игра была проигнорирована , Это то, что происходило в моем коде, и ответ ниже фиксировал это. – Echelon

ответ

54

компании Apple AVAudioPlayer class reference говорит:

Метод остановки не сбрасывает значение свойства CURRENTTIME 0. Другими словами, если вы звоните остановку во время воспроизведения, а затем вызвать воспроизведение, воспроизведение возобновляется в точке, где это прекращено.

Таким образом, вы должны быть в состоянии перезапустить его:

[ahhhhhSound stop]; 
ahhhhhSound.currentTime = 0; 
[ahhhhhSound play]; 
+0

Я нашел проблему с этим на устройствах iOS 4.3.3 и 4.3.5 по крайней мере. Он работает нормально на устройствах iOS 5.0.1. (iPhone 4 и 4S) после остановки, а затем установите currentTime на 0, затем воспроизведите, игра на самом деле не сработает (возврат NO). Я тяну сюда свои волосы ... – Jonny

+0

@Jonny: Тогда задайте новый вопрос. Этот вопрос составляет 1,5 года ;-) – DarkDust

+0

Нет. Я не нашел обходного пути, и я нахожусь в беге для вашей славы ;-) – Jonny

6

Так у меня были некоторые проблемы, как вы можете видеть из моего комментария на ответ DarkDust в. Проблема появилась только в iOS 4.3.3/4.3.5, iPhone 4. Возможно, раньше были версии iOS, но не iOS 5.0.1. Как-то сам AVAudioPlayer, казалось, «ломал», когда останавливал его, и последняя игра просто провалилась необъяснимо. На самом деле «стоп» выгружает некоторые вещи, загруженные в prepareToPlay, которые не выгружаются, если вы просто «приостанавливаете» игрока - согласно ссылке. Поэтому мое решение будет использовать паузу вместо остановки - считается, что игрок в данный момент играет, иначе не было бы причин останавливать что-либо. Если теоретически будет быстрее. Решил это для меня.

if (ahhhhhSound.playing) { 
    [ahhhhhSound pause]; 
} 
ahhhhhSound.currentTime = 0; 
[ahhhhhSound play]; 

Теперь я могу снова продолжить жизнь.

+0

+1 к этому решению. У меня были проблемы с остановкой (звуки разрывались, только конечные части играли бы другие звуки и т. Д.) У меня есть несколько экземпляров AVAudioPlayer). Использование паузы и установка currentTime в 0 разрешает все мои проблемы! –

+0

Да, pause() - правильный способ сделать это. – StackUnderflow

0

Swift:

mySound.audioPlayer?.stop() 
mySound.audioPlayer?.currentTime = 0 
mySound.audioPlayer?.play() 
Смежные вопросы