iPhone AudioServicesPlaySystemSound:通过耳机路由?
Posted
技术标签:
【中文标题】iPhone AudioServicesPlaySystemSound:通过耳机路由?【英文标题】:iPhone AudioServicesPlaySystemSound: route though headphones? 【发布时间】:2011-01-16 15:26:05 【问题描述】:我在使用 AudioservicesPlaySystemSound 时遇到问题。当输出通过扬声器时,效果很好。但是,当用户插入耳机时,没有输出。有没有一种简单的方法来设置某种监听器,以便音频在插入耳机时自动通过耳机路由,否则通过扬声器?
我正在使用以下方法播放简短的 AIF 声音样本:
-(void)playAif:(NSString *)filename
SystemSoundID soundID;
NSString *path = [[NSBundle mainBundle]
pathForResource:filename ofType:@"aif"];
if (path) // test for path, to guard against crashes
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);
AudioServicesPlaySystemSound (soundID);
我知道我一定遗漏了一些东西,一些可以做到这一点的设置。有什么想法吗?
【问题讨论】:
查看 AudioSessions 上的文档 -developer.apple.com/library/ios/#documentation/Audio/Conceptual/… @Till 谢谢你教我钓鱼!我之前检查过文档,但错过了相关信息。用后代的解决方案更新下面的问题。谢谢! 【参考方案1】:感谢@Till 将我指向relevant portion of the docs。对于有此问题的其他人,解决方案是明确设置会话类别,在我的情况下为环境声音。此代码截自apple's docs:
UInt32 sessionCategory = kAudioSessionCategory_AmbientSound; // 1
AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory, // 2
sizeof (sessionCategory), // 3
&sessionCategory // 4
);
所以,我现在播放音频的方法是这样的:
-(void)playAif:(NSString *)filename
// NSLog(@"play: %@", filename);
SystemSoundID soundID;
NSString *path = [[NSBundle mainBundle]
pathForResource:filename ofType:@"aif"];
if (path) // test for path, to guard against crashes
UInt32 sessionCategory = kAudioSessionCategory_AmbientSound; // 1
AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory, // 2
sizeof (sessionCategory), // 3
&sessionCategory // 4
);
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);
AudioServicesPlaySystemSound (soundID);
这很容易解决我的问题!我唯一担心的是每次播放声音时都明确设置它可能会过度。任何人都知道更好,更安全的方法来设置它并忘记它吗?否则,这会很有效。
【讨论】:
谢谢,我无法让声音正常工作,关键是设置类别。 AudioSessionSetProperty 在 iOS 7 中已弃用以上是关于iPhone AudioServicesPlaySystemSound:通过耳机路由?的主要内容,如果未能解决你的问题,请参考以下文章
在 iphone 5 和 iphone 6 中动态设置字体大小