【问题标题】:iOS: How to Have a Certain Action Occur for a Specific Time Duration?iOS:如何在特定时间段内发生某个动作?
【发布时间】:2011-10-14 20:27:10
【问题描述】:

在我的应用程序中,我使用 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

用语言来说——我希望在播放 aud1 时,将 aud2 音量减半;一旦文件结束,aud2 音量将恢复到满级。我无法从文档中了解如何做到这一点。

有人可以帮忙吗?

【问题讨论】:

    标签: ios avaudioplayer volume duration


    【解决方案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;
         }
    }
    

    请注意,上面的代码显然不完整,但应该为您指明正确的方向。

    【讨论】:

    • 大卫,非常感谢!我仍然不完全清楚 - 我的应用程序如何识别 aud1 经历了“audioPlayerDidFinishPlaying”事件?委托的事情是否会在没有任何进一步说明的情况下使其按我的意图工作?
    • 没错。 AVAudioPlayer 将在播放完成时向其代理发送消息(注意:这不包括暂停的音频)。在我的示例代码中,我将委托设置为实例化玩家的任何对象,但如果这对您的情况更有意义,您可以创建一个单独的委托。请注意,您用作代理的任何内容都需要实现 AVAudioPlayerDelegate 协议。你可以find out a little more about delegates here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多