AVAudioPlayer 和按钮按下

Posted

技术标签:

【中文标题】AVAudioPlayer 和按钮按下【英文标题】:AVAudioPlayer and Button Presses 【发布时间】:2013-04-13 17:49:40 【问题描述】:

嘿,我正在设计一个 iphone 应用程序,它以编程方式将按钮加载到滚动视图中并播放声音。我已经让声音按顺序播放,这很棒,但是每当我尝试按下按钮时,它不会记录按钮按下,直到序列中的最后一个声音开始播放。这是我播放 AVAudioPlayer 的主视图控制器中的代码:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 
for (menuCount = 0; menuCount < [ivrTree count]; menuCount++ ) 

    currentScript = [ivrTree objectAtIndex: menuCount];

    for (btnCount = 0; btnCount < [currentScript.menuChoices count]; btnCount = btnCount) 
        currentChoice = [currentScript.menuChoices objectAtIndex: btnCount];
        if (![thePlayer isPlaying]) 
            if (!mute) 
                [self playPromptAudiofromSRC:self src:currentChoice.audiosRC];
            
            btnCount++;
        
    

thisMenuPlayed = true;


- (void)playPromptAudiofromSRC:(id)parent src:(NSString *)src 

NSURL *fileURL;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *audioPrompt = [NSString stringWithFormat:@"%@%@", [defaults stringForKey:CONFIG_IVR_HOST], src];

if ([src isEqualToString:@""] || src == nil) 
    audioPrompt = @"silence1sec";
    NSString *path = [[NSBundle mainBundle] pathForResource:audioPrompt ofType:@"wav"];
    fileURL = [NSURL fileURLWithPath:path];
 else 
    fileURL = [NSURL URLWithString:audioPrompt];


AudioServicesDisposeSystemSoundID (_audioPromptSound);
AudioServicesCreateSystemSoundID((CFURLRef)fileURL, &_audioPromptSound);
AudioServicesPlaySystemSound(_audioPromptSound);

//NSLog(@"Audio SRC: %@", audioPrompt);
NSData *soundData = [NSData dataWithContentsOfURL:fileURL];
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"sound.caf"];

[soundData writeToFile:filePath atomically:YES];

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL
                                                       fileURLWithPath:filePath] error:NULL];  
self.thePlayer = player;
[player release];
[thePlayer prepareToPlay];
[thePlayer setVolume:1.0f];
[thePlayer play];

我不知道为什么这只会在整个播​​放后记录按钮按下。我正在尝试实现一个静音按钮和一种在音频播放时“插入”音频的方法。提前感谢您的帮助

【问题讨论】:

【参考方案1】:

编辑:

添加委托:

在您的 .h 文件中:

@interface ViewController : UIViewController<AVAudioPlayerDelegate>

在您的 .m 文件中:

thePlayer.delegate = self;
[thePlayer play];

正如我所见,您的 animationDidStop 可能存在问题,因为无论您做什么,它都会遍历所有声音。我将尝试逐行逐句解释我的目标(并且由于我看不到您的整个代码,所以会有一些猜测)。

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 
// Iterate through array ivrTree elements.
for (menuCount = 0; menuCount < [ivrTree count]; menuCount++ ) 

    // Starting with currentScript = ivrTree objectAtIndex 0
    currentScript = [ivrTree objectAtIndex: menuCount];

    //Iterate through menuChoices, Starting with objectAtIndex 0
    for (btnCount = 0; btnCount < [currentScript.menuChoices count]; btnCount = btnCount) 
        //Set currentChoice to menuChoices objectAtIndex 0
            currentChoice = [currentScript.menuChoices objectAtIndex: btnCount];
        //Will try to run playPromptAudiofromSRC if thePlayer isn't playing. Will 1st run evaluate as false and therefor will play.
            if (![thePlayer isPlaying]) 
                if (!mute) 
                    [self playPromptAudiofromSRC:self src:currentChoice.audioSRC];
                
        //Will increment btnCount to 1 when the audio has played through.
            btnCount++;
            
        //If sound hasn't finished playing it will stay in the for loop and keep trying until first sound is done playing.
    
//Will increment menuCount 1 and start the next for loop all over again.

thisMenuPlayed = true;

你能看出我在说什么吗?如果您启动乐器并检查正在发生的事情,我很确定您会看到活动高峰,直到所有声音都播放完后才会消退。 我认为这种方法的编写方式会锁定您的设备。希望对您有所帮助。

【讨论】:

在我调用 playPrompAudioFromSRC 方法之前我有一个 if ([thePlayer isPlaying]) ,所以它只会增加 btnCount 并在第一个音频完成后播放下一个音频。添加 [thePlayer stop] 没有帮助。也不知道你所说的错误处理是什么意思 不,这两个我都没有。让我现在试试 我应该把 东西放在哪里? 它没有用 - 我把 和 thePlayer.delegate = self; 我从来没有设置播放和静音 - 他们需要覆盖吗?我应该发布什么方法?顺便说一句,感谢您的时间和帮助

以上是关于AVAudioPlayer 和按钮按下的主要内容,如果未能解决你的问题,请参考以下文章

如何安全地停止 AVAudioPlayer

使用 NSUserDefaults 和 AVAudioPlayer 制作静音切换按钮

静音按钮不会静音 AVAudioPlayer

使用 AVAudioPlayer 一次播放多个声音

AVAudioPlayer 正在再次播放而不被称为播放。

如何使用 AVAudioPlayer 释放声音?