iOS: как выполнить определенное действие в течение определенного времени?

В моем приложении я использую объекты AVAudioPlayer для хранения mp3-файлов. У меня было несколько случаев, когда я хотел понизить уровень звука файлов во время их воспроизведения.

Я понимаю кое-что из того, что я должен делать, но я не понимаю, как я определяю продолжительность и как приказываю, чтобы что-то происходило только в течение этого времени.

Я ищу что-то вроде этого:

AVAudioPlayer * aud1 = [I have a method to get the file];
AVAudioPlayer * aud2 = [I have a method to get the file];
NSTimeInterval * aud1_ti = aud1.duration //I haven't tried this yet - is this the right way to get the mp3 play duration?
[aud1 play];
[aud2 play];
while (aud1_ti)
     aud2.volume = 0.5;
aud2.volume = 1.0

Если сказать словами - хотелось бы, чтобы при воспроизведении ауд1 громкость ауд2 уменьшалась вдвое; и как только файл достигнет своего конца, громкость aud2 вернется к своему полному уровню. Я не мог понять из документации, как это сделать.

Кто-нибудь может помочь?


person Ohad Regev    schedule 14.10.2011    source источник


Ответы (1)


Вместо того, чтобы основывать это на продолжительности, вы, вероятно, захотите, чтобы делегат вашего AVAudioPlayer ответил на – audioPlayerDidFinishPlaying:successfully: и сбросьте громкость на тот момент. На очень, очень базовом уровне у вас будет что-то вроде этого:

- (void)startPlaying {
     self.aud1.delegate = self;
     [self.aud1 play];

     self.aud2.volume = 0.5;
     [self.aud2 play];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL) {
     if (self.aud2) {
          self.aud2.volume = 1.0;
     }
}

Обратите внимание: приведенный выше код явно неполный, но должен указать вам правильное направление.

person David Brainer    schedule 14.10.2011
comment
Давид, большое спасибо! Мне до сих пор не совсем понятно. Как мое приложение распознает, что aud1 прошел через событие audioPlayerDidFinishPlaying? Заставляет ли делегат работать так, как я намереваюсь, без каких-либо дополнительных инструкций? - person Ohad Regev; 16.10.2011
comment
Это правильно. AVAudioPlayer отправит сообщение своему делегату, когда воспроизведение завершится (примечание: это не включает приостановленный звук). В моем примере кода я установил делегата для любого объекта, создающего экземпляры игроков, но вы можете создать отдельный делегат, если это имеет больше смысла в вашем случае. Обратите внимание, что все, что вы используете в качестве своего делегата, должно реализовать протокол AVAudioPlayerDelegate. Вы можете узнать немного больше о делегатах здесь. - person David Brainer; 18.10.2011