切换到iOS 5后无法播放系统声音
这是我如何在iOS 4中发挥嘟嘟声的效果:
SystemSoundId beepOnSoundId; CFURLRef soundUrl = CFBundleCopyResourceURL( CFBundleGetMainBundle(), CFSTR("beep"), CFSTR("wav"), NULL ); // soundUrl logged: // file://localhost/var/mobile/Applications/ ... beep.wav AudioServicesCreateSystemSoundID(soundUrl, &beepOnSoundId); // beepOnSoundId logged: 4097 AudioServicesPlaySystemSound(beepOnSoundId);
当我将设备升级到iOS 5时,它停止工作。 我什么也没听到。 我注销了所有的variables,没有零或0。
iOS 5中如何改变API,打破了我的声音播放代码?
更新
这个问题可能是因为我在播放声音的时候运行了AVCaptureSession
。 不知何故,iOS 5不会让你这样做了。 当我从相机录制某些东西时,我需要发出哔哔声。
如果你有一个AVCaptureSession运行,这个错误报告可能与你的问题有关。
在iOS 5下,当使用AudioServicesPlaySystemSound调用时,当audio设备处于活动状态的AVCaptureSession处于活动状态时,它将不起作用。
一个问题可能是,在调用AudioServicesPlaySystemSound时,如果在audio设备处于活动状态时存在活动的AVCaptureSession,则它将停止工作。
同时检查文件中的导入名称,确保audiotoolbox导入在您的所有视图控制器中。 我也去了一个指导,并得到了你:)我将离开网站的名字在底部
第1步:导入AudioToolbox框架首先将Audio Toolbox框架导入到应用程序中,以使System Sound Services可用于您的代码。 为此,请在Xcode的Project Navigator窗格中select“PhoneAppSkin”项目,然后在“TARGETS”下select“PhoneAppSkin”,最后select“Build Phases”选项卡。 这样做后,你的屏幕应该是这样的:
接下来,点击“Link Binary With Libraries”下拉菜单,然后点击“+”符号为项目的链接阶段添加一个新的框架。
最后,在popup窗口中find“AudioToolbox”框架,然后单击“添加”。
接下来,打开PhoneViewController.h文件并添加实际将Audio Toolbox框架导入到您的类中所需的行:
#import <UIKit/UIKit.h> #import <AudioToolbox/AudioToolbox.h>
audio工具箱function现在应该工作
网站我从图片中获得了: http : //mobile.tutsplus.com/tutorials/iphone/ios-sdk_playing-systemsoundid/
我有几乎相同的代码,它适用于我在iOS5与video和audio媒体会话。 如果你有一个函数中的所有代码来播放声音,问题可能是在播放声音之前SystemSoundID对象被释放,或者问题可能出在URL上。 但我想这是第一个。
请参阅以下代码:
SystemSoundID声明位于对象的标题中,对象的生命期足以播放声音。
SystemSoundID soundID;
AudioServicesCreateSystemSoundID在对象初始化中。
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"sound" ofType:@"wav"]], &soundID);
然后,您可以在对象内部的任何位置使用AudioServicesPlaySystemSound 。
AudioServicesPlaySystemSound(soundID);
尝试把这些代码放在适当的地方,你应该听到声音。
在我的构造函数中:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil]; UInt32 doSetProperty = 1; AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty); [[AVAudioSession sharedInstance] setActive: YES error: nil]; NSURL* musicFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"video-sent" ofType:@"caf"]]; self.sentSound = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil]; [self.sentSound prepareToPlay];
函数playSentSound
- (void)playSentSound { DLog(@"PLay Sound %@", self.sentSound); [self.sentSound play]; }
然后在代码中,我只是叫它
[self playSentSound];
这里的关键是前4行… 😉