多个按钮上的声音并在其他人在 iOS 中播放时停止

Posted

技术标签:

【中文标题】多个按钮上的声音并在其他人在 iOS 中播放时停止【英文标题】:Sounds on multiple buttons and stop when others play in iOS 【发布时间】:2013-03-29 05:09:21 【问题描述】:

我正在尝试编写一个小应用程序来学习一些 ios 开发的基础知识,如果这是基础知识,请原谅我。我查看了很多线程,但我认为我有几个特定于这个应用程序的问题。

    我见过几种在按下按钮时播放音频的不同方式。一个涉及“CFBundleRef”(How to play iPhone tap sound?)和另一个“AVAudioPlayer”(Play Audio iOS Objective-C)。我如何知道使用哪个以及何时适当使用每个?

    我目前使用第一个选项使音频正常工作,但我似乎无法弄清楚当按下另一个按钮时如何让声音停止。我该怎么做?

    除了我所做的之外,还有更简单的方法可以将 15 个声音/按钮链接在一起吗?

这是 .m 文件:

#import "animalsViewController.h"

@interface animalsViewController ()

@end


@implementation animalsViewController


-(IBAction) boom; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"bird", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom2; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"bird2", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);


-(IBAction) boom3; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"bird3", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom4; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"chicken1", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom5; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"chicken2", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom6; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"cow", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom7; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"dog1", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom8; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"duck", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom9; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"horse", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom10; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"lion", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom11; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"monkey", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom12; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"owl", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom13; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"pig", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom14; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"rooster", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);



-(IBAction) boom15; 

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"sheep", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);




- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.







@end

这是 .h 文件:

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>

@interface animalsViewController : UIViewController




-(IBAction) boom;
-(IBAction) boom2;
-(IBAction) boom3;
-(IBAction) boom4;
-(IBAction) boom5;
-(IBAction) boom6;
-(IBAction) boom7;
-(IBAction) boom8;
-(IBAction) boom9;
-(IBAction) boom10;
-(IBAction) boom11;
-(IBAction) boom12;
-(IBAction) boom13;
-(IBAction) boom14;
-(IBAction) boom15;

@end

【问题讨论】:

这是一个很好的问题,但你在帖子 1 中的做法也很好。特别是在初始代码之后简单地剪切和粘贴!然后简单地将按钮拖放到 IB 点! 【参考方案1】:

使用单个 AVAudioPlayer 实例,以及类似以下内容..

-(void)playAudioOfType:(int)type

     [self stopAudio];


     NSString *sound=@"";

     switch (type) 
       case 1:
          sound=@"bird";
        break;

       case 2:
          sound=@"bird2";
        break;

       case 3:
          sound=@"bird3";
        break;

       case 4:
          sound=@"chicken";
        break;

       default:
         break;
      


      NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                     pathForResource:sound
                                     ofType:@"mp3"]];



NSError *error;
if(url)
    audioPlayer = [[AVAudioPlayer alloc]
                   initWithContentsOfURL:url
                   error:&error];



    if (error)
    
        NSLog(@"Error in audioPlayer: %@", 
              [error localizedDescription]);
     else 
        audioPlayer.delegate = self;
        [audioPlayer prepareToPlay];
    

    [audioPlayer play];



 

 -(void)stopAudio

if(audioPlayer && [audioPlayer isPlaying])
    [audioPlayer stop];
    audioPlayer=nil;




然后你的每一个动作你都可以像下面这样调用函数

-(IBAction) boom; 
     [self playAudioOfType:1]; //Will play bird.mp3


-(IBAction) boom1; 
     [self playAudioOfType:2]; //Will play bird2.mp3


-(IBAction) boom2; 
     [self playAudioOfType:3]; //Will play bird3.mp3

找到一个测试应用here ..您只需在应用中添加 mp3 文件,它应该可以工作..

【讨论】:

那么,我需要清除所有 -(IBAction) boom1;行并用第一段代码替换它?抱歉.. 对 objc 和 ios 非常陌生:| 不,您不必删除动作,您可以在不同类型的每个动作中使用相同的函数,并在函数内部定义声音文件。但更好的方法是创建单个动作为按钮分配了不同的标签。如果你不明白,请告诉我。。 所以你是说去掉以“CFBundleRef ...”开头的位,然后把你包含的第二段代码,然后把第一段代码放在前面?如果不是..那么..我不明白:D 我很抱歉.. 我还是不明白。我应该删除我的 .h 和 .m 文件并包含你写的内容吗? :/ 我知道它一定很简单,我只是很新。 添加了一个测试应用,看我的评论。【参考方案2】:

试试这个链接:Simple sound question

请参阅此问题的最后一个...

    -(void)stop
    
            AudioServicesDisposeSystemSoundID (_soundID);
            self.IsPlaying = FALSE;
    

【讨论】:

这会去哪里?对不起..这里很新o.O

以上是关于多个按钮上的声音并在其他人在 iOS 中播放时停止的主要内容,如果未能解决你的问题,请参考以下文章

正在播放其他应用程序中的声音时录音停止

进入下一帧/错误时如何停止循环声音

在 iOS (Novocaine) 上播放和停止声音样本

按钮停止多个音轨

触发 AVAudioPlayer 以停止所有声音并播放选定的声音,除非单击播放(选定)按钮

windows phone 7中的循环声音