我通过扬声器播放音乐时遇到了一些问题。 我在以下链接中找到了一个示例 How to get AVAudioPlayer output to the speaker 但问题是如何确保我通过“扬声器”成功实现了播放音乐? 我把代码编写为链接,但在激活之前和之后似乎没有区别 iphone模拟器上的“扬声器”(在macbook上)!!
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord ; // 1
AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory, // 2
sizeof (sessionCategory), // 3
&sessionCategory // 4
);
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; // 1
AudioSessionSetProperty (
kAudioSessionProperty_OverrideAudioRoute, // 2
sizeof (audioRouteOverride), // 3
&audioRouteOverride // 4
);
下面的是我停用扬声器的方式
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; // 1
AudioSessionSetProperty (
kAudioSessionProperty_OverrideAudioRoute, // 2
sizeof (audioRouteOverride), // 3
&audioRouteOverride // 4
);
当我试图将kAudioSessionProperty_AudioRoute的内容检查为 NSLog(@“%@”,kAudioSessionProperty_AudioRoute); ,模拟器崩溃了。
我查阅文档,CFStringRef与NSString类型几乎相同。 因此,使用NSLog打印kAudioSessionProperty_AudioRoute的值是合理的。
正如你所说,kAudioSessionProperty_AudioRoute应该是“耳机”或“扬声器” 如果我粘贴的代码是正确的,并且我激活扬声器的方式是正确的,我仍然无法制作。 你能救我吗?
答案 0 :(得分:3)
你的macbook只有一套扬声器,所以你只能听到它。手机底部有接收器耳机和扬声器(你想用它)。
只需检查kAudioSessionProperty_AudioRoute
设置为的内容。
... kAudioSessionProperty_AudioRoute 当前音频路由的名称(例如“耳机”,“扬声器”等)。只读CFStringRef值。
有关覆盖扬声器属性的更多信息:
此属性只能与kAudioSessionCategory_PlayAndRecord(或等效的AVAudioSessionCategoryRecord)类别一起使用。 (...)默认情况下,此类别的输出音频将传送到接收器 - 通话时您握在耳边的扬声器。 kAudioSessionOverrideAudioRoute_Speaker常量可让您将输出音频定向到位于手机底部的扬声器。
kAudioSessionProperty_OverrideCategoryDefaultToSpeaker ..指定在没有连接其他音频路径(如耳机)时是否将音频路由到扬声器(而不是接收器)。默认情况下,此属性的值为FALSE(0)。读/写UInt32值。
此属性通过音频路径更改(例如插入或拔出耳机时)和中断时保留其值;只有在音频会话类别更改时,它才会恢复为默认值。此属性只能与kAudioSessionCategory_PlayAndRecord(或等效的AVAudioSessionCategoryRecord)类别一起使用。
另见kAudioSessionProperty_OverrideAudioRoute。
答案 1 :(得分:1)
我遇到了同样的问题;
但最终以这种方式改写....
void EnableSpeakerPhone ()
{
UInt32 dataSize = sizeof(CFStringRef);
CFStringRef currentRoute = NULL;
OSStatus result = noErr;
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, ¤tRoute);
// Set the category to use the speakers and microphone.
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory,
sizeof (sessionCategory),
&sessionCategory
);
assert(result == kAudioSessionNoError);
Float64 sampleRate = 44100.0;
dataSize = sizeof(sampleRate);
result = AudioSessionSetProperty (
kAudioSessionProperty_PreferredHardwareSampleRate,
dataSize,
&sampleRate
);
assert(result == kAudioSessionNoError);
// Default to speakerphone if a headset isn't plugged in.
UInt32 route = kAudioSessionOverrideAudioRoute_Speaker;
dataSize = sizeof(route);
result = AudioSessionSetProperty (
// This requires iPhone OS 3.1
kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
dataSize,
&route
);
assert(result == kAudioSessionNoError);
AudioSessionSetActive(YES);
}
然后..我创建了一个名为(void DisableSpeakerPhone();)的新方法来反转(EnableSpeakerPhone)方法
void DisableSpeakerPhone ()
{
UInt32 dataSize = sizeof(CFStringRef);
CFStringRef currentRoute = NULL;
OSStatus result = noErr;
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, ¤tRoute);
// Set the category to use the speakers and microphone.
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory,
sizeof (sessionCategory),
&sessionCategory
);
assert(result == kAudioSessionNoError);
Float64 sampleRate = 44100.0;
dataSize = sizeof(sampleRate);
result = AudioSessionSetProperty (
kAudioSessionProperty_PreferredHardwareSampleRate,
dataSize,
&sampleRate
);
assert(result == kAudioSessionNoError);
// Default to speakerphone if a headset isn't plugged in.
// Overriding the output audio route
// The Trick is here
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
dataSize = sizeof(audioRouteOverride);
AudioSessionSetProperty(
kAudioSessionProperty_OverrideAudioRoute,
dataSize,
&audioRouteOverride);
assert(result == kAudioSessionNoError);
AudioSessionSetActive(YES);
}
现在,让切换台或任何btn直接调用方法......