在iOS中播放简短的声音

我想我可以使用AVAudioPlayer播放声音,但是,我需要的只是播放一个短的声音,我不需要任何循环或细粒度的音量控制等。

有没有一个简单的方法来做到这一点?

其他答案中的每一个都会泄漏内存(除非启用了其中一个答案的ARC)…奇怪的是,原来标记为正确的答案没有明显的原因,因此调用retainCount

如果你alloc/init东西,它需要被释放(除非你使用ARC)。

如果您调用AudioServicesCreateSystemSoundID() ,则必须处理所产生的声音。

请参阅audio用户界面声音示例。

基本上:

 @interface MyClass:UI*ViewController // fixed { SystemSoundID mySound; } @implementation MyClass - (void) viewDidLoad { [super viewDidLoad]; AudioServicesCreateSystemSoundID(.... URL ...., &mySound); } - (void) playMySoundLikeRightNowReally { AudioServicesPlaySystemSound(mySound); } - (void) dealloc { AudioServicesDisposeSystemSoundID(mySound); [super dealloc]; // only in manual retain/release, delete for ARC } @end 

为了完整性:
添加AudioToolbox.framework
#import <AudioToolbox/AudioToolbox.h>

对于短的声音剪辑(less于30秒),有一个SystemSounds库非常好。

优点:您不需要单独pipe理音量设置。 声音在单独的线程中播放,audio剪辑的加载和播放速度很快。 总之,你把这个剪辑当作另一个系统声音。

缺点:您无法提供单独的audio控制设置。 它与系统声音的设置有关。 你不能玩超过30秒。 您可能无法应用任何声音滤镜来增强audio效果。

当然有更多的优点和缺点,但这些是我能想到的,从我的头顶。

使用此导入: <AudioToolbox/AudioToolbox.h>添加AudioToolbox框架,然后调用下面的方法,如[self playSound],无论你想播放剪辑。

 -(void) playSound { NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"changeTrack" ofType:@"aif"]; SystemSoundID soundID; AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); AudioServicesPlaySystemSound (soundID); [soundPath release]; } 

我只是用这个代码来播放工作正常的短mp3audio:

在@implementation下面声明这个

 NSString *path; NSURL *url; //where you are about to add sound path =[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"quotes_%d",soundTags] ofType:@"mp3"]; url = [NSURL fileURLWithPath:path]; player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL]; [player setVolume:1.0]; [player play]; //just add AVFoundation framework 

迅速

其他答案在这里使用Objective-C,所以我在这里提供了一个Swift版本。 Swift使用自动引用计数(ARC),所以我不知道这个答案有任何内存泄漏问题(正如接受的答案中提到的那样)。

使用AudioToolbox

您可以使用AudioToolbox框架在您不需要太多控制播放方式的时候播放简短的声音。

这里是你如何设置它:

 import UIKit import AudioToolbox class PlaySoundViewController: UIViewController { var soundURL: NSURL? var soundID: SystemSoundID = 0 @IBAction func playSoundButtonTapped(sender: AnyObject) { let filePath = NSBundle.mainBundle().pathForResource("yourAudioFileName", ofType: "mp3") soundURL = NSURL(fileURLWithPath: filePath!) if let url = soundURL { AudioServicesCreateSystemSoundID(url, &soundID) AudioServicesPlaySystemSound(soundID) } } } 

笔记:

  • 这个例子是从如何在Swift中用AudioToolbox播放一个简短的声音片段来改编的 。
  • 请记住将您的yourAudioFileName.mp3 (或.wav等)添加到您的项目。
  • 记得import AudioToolbox
  • 这个答案把代码放在一个IBActionbutton中,当然也可以很容易地把它放在另一个function上。

使用AVAudioPlayer

通过导入AVFoundation框架,您可以使用AVAudioPlayer 。 它适用于短audio剪辑和长歌曲。 与AudioToolbox方法相比,您还可以更好地控制播放。

这里是你如何设置它:

 import UIKit import AVFoundation class PlaySoundViewController: UIViewController { var mySound: AVAudioPlayer? // a button that plays a sound @IBAction func playSoundButtonTapped(sender: AnyObject) { mySound?.play() // ignored if nil } override func viewDidLoad() { super.viewDidLoad() // initialize the sound if let sound = self.setupAudioPlayerWithFile("yourAudioFileName", type: "mp3") { self.mySound = sound } } func setupAudioPlayerWithFile(file: NSString, type: NSString) -> AVAudioPlayer? { let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String) let url = NSURL.fileURLWithPath(path!) var audioPlayer: AVAudioPlayer? do { try audioPlayer = AVAudioPlayer(contentsOfURL: url) } catch { print("Player not available") } return audioPlayer } } 

笔记:

  • 这个例子是根据Swift教程5:使它变美(添加声音)
  • 请记得import AVFoundtation并将您的import AVFoundtation添加到您的项目。

我用这个代码在iOS上播放一个简短的aiff声音

 #import <AudioToolbox/AudioServices.h> SystemSoundID completeSound; NSURL *audioPath = [[NSBundle mainBundle] URLForResource:@"downloadCompleted" withExtension:@"aiff"]; AudioServicesCreateSystemSoundID((CFURLRef)audioPath, &completeSound); AudioServicesPlaySystemSound (completeSound); 

希望这可以帮助。

简单的清洁SWIFT 3版本

我喜欢更多的控制我的声音,所以我使用AVFoundation。

 import AVFoundation class TodayViewController: UIViewController { var clink: AVAudioPlayer? var shatter: AVAudioPlayer? override func viewDidLoad() { super.viewDidLoad() // initialize the sound shatter = setupAudioPlayer(withFile: "shatter", type: "wav") clink = setupAudioPlayer(withFile: "clink", type: "wav") } func setupAudioPlayer(withFile file: String, type: String) -> AVAudioPlayer? { let path = Bundle.main.path(forResource: file, ofType: type) let url = NSURL.fileURL(withPath: path!) return try? AVAudioPlayer(contentsOf: url) } func onClick() { clink?.play() } } 

确保你的声音文件被添加到你的项目,并导入AVFoundation。

我的回答是Bill的回答,但是我没有使用init或者dealloc来使用它,并且在播放之后释放声音:

 - (void)playSound:(NSURL *)url SystemSoundID ssID = 0; AudioServicesCreateSystemSoundID((CFURLRef)url, &ssID); AudioServicesAddSystemSoundCompletion(ssID, NULL, NULL, (AudioServicesSystemSoundCompletionProc)MyAudioServicesSystemSoundCompletionProc, NULL); AudioServicesPlaySystemSound(ssID); //AudioServicesDisposeSystemSoundID(ssID); } void MyAudioServicesSystemSoundCompletionProc (SystemSoundID ssID, void *clientData) { AudioServicesDisposeSystemSoundID(ssID); } 

下面是一个快速干净的方法,您可以复制并在您的应用程序中使用:

 -(BOOL) playSoundFXnamed: (NSString*) vSFXName Loop: (BOOL) vLoop { NSError *error; NSBundle* bundle = [NSBundle mainBundle]; NSString* bundleDirectory = (NSString*)[bundle bundlePath]; NSURL *url = [NSURL fileURLWithPath:[bundleDirectory stringByAppendingPathComponent:vSFXName]]; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; if(vLoop) audioPlayer.numberOfLoops = -1; else audioPlayer.numberOfLoops = 0; BOOL success = YES; if (audioPlayer == nil) { success = NO; } else { success = [audioPlayer play]; } return success; } 

然后只使用:

 [self playSoundFXnamed:@"someAudio.mp3" Loop: NO]; 

如果你要循环,那么你需要把你的AVAudioPlayer *audioPlayeraudio播放器放到你的课堂,以便能够停止声音..如果你只是想要一个短的声音,你不这样做。

使用ARC …我从来没有做任何事情与NSError,所以使用它,如果你喜欢…

很多答案都令人困惑,有些使用AudioToolbox框架,不同于AVAudioFoundation框架…这就是我所做的。 在.h文件中,我把这个代码放在:

@property (nonatomic, retain) AVAudioPlayer *player;

此代码声明一个名为“播放器”的audio播放器。 在.m文件的@implementation声明下,添加@synthesize player 。 这合成该player财产。

在你想要的任何function中,通过添加下面这行代码,将你的声音绑定到播放器上,其中yourSound是声音文件的名称, aif是你的文件扩展名:

player = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"yourSound" withExtension:@"aif"] error:nil]

我知道苹果文档说,要声明一个string和一个NSURL,但是如果你把它合并成一行,那么你将不必在之后处理它。 另外,由于这是ViewController.m文件中的一个属性,因此您不必设置该player对象以配合您的声音。

其他的答案还包括使用SystemSoundID ,但也有一些限制,如“文件不能超过30秒”,“它必须是特定的格式”和作品。 有了它,它可以一次播放几个声音(如果您正在开发音板),创build声音更容易。

要真正发挥你的声音,插入这一行(是的,这真的很简单):

[player play]

如果您使用ARC,则不能手动处理播放器,因为系统会为您执行此操作。 如果您是开发新手,并且正在使用最新版本的Xcode,那么您已经启用了ARC。 如果出于某种奇怪的原因,你不这样做,那么处理player使用的资源的代码是:

[player release]

从声音只能在设备上工作,但不能在模拟器上工作

Nick创build了一个可用于在iOS和Mac应用程序中播放声音的库。

请参阅nicklockwood / SoundManager

请参阅简单的iOSaudio播放

 - (void)playSound { SystemSoundID soundId; // NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"sample" // withExtension:@"caf"]; // AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &soundId); NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"mp3"]; AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &soundId); AudioServicesAddSystemSoundCompletion(soundId, NULL, NULL, systemAudioCallback, NULL); AudioServicesPlaySystemSound(soundId); //AudioServicesPlayAlertSound(soundId); } - (void) systemAudioCallback(SystemSoundID soundId, void *clientData) { AudioServicesRemoveSystemSoundCompletion(soundId); AudioServicesDisposeSystemSoundID(soundId); } 

检查系统播放短audio文件

包括audiotoolbox框架

并创build

systemsoundid对象

 NSString *soundPath = [[NSBundle mainBundle] pathForResource:file ofType:@"aiff"]; AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); AudioServicesPlaySystemSound (soundID);