0

我有一些关于通过扬声器播放音乐的问题。我在以下链接中找到了一个示例 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 应该是“耳机”或“扬声器”,如果我粘贴的代码是正确的并且我激活扬声器的方式是正确的,我仍然无法制作。你能帮助我吗?

4

2 回答 2

3

你的 macbook 只有一组扬声器,所以你只会听到它。手机底部有接收器听筒和扬声器(您想使用)。

只需检查kAudioSessionProperty_AudioRoute设置为。

苹果表示:

kAudioSessionProperty_AudioRoute... 当前音频路由的名称(如“耳机”、“扬声器”等)。一个只读的 CFStringRef 值。

有关覆盖扬声器属性的更多信息:

此属性只能与 kAudioSessionCategory_PlayAndRecord(或等效的 AVAudioSessionCategoryRecord)类别一起使用。(...) 默认情况下,此类别的输出音频会发送到接收器,即您打电话时放在耳边的扬声器。kAudioSessionOverrideAudioRoute_Speaker 常量允许您将输出音频定向到位于手机底部的扬声器。

kAudioSessionProperty_OverrideCategoryDe​​faultToSpeaker .. 指定在没有连接其他音频路由(例如耳机)时是否将音频路由到扬声器(而不是接收器)。默认情况下,此属性的值为 FALSE (0)。一个读/写 UInt32 值。

此属性通过音频路由更改(例如插入或拔出耳机时)和中断时保留其值;它仅在音频会话类别更改时恢复为其默认值。此属性只能与 kAudioSessionCategory_PlayAndRecord(或等效的 AVAudioSessionCategoryRecord)类别一起使用。

另请参见 kAudioSessionProperty_OverrideAudioRoute。

于 2010-07-29T14:54:07.173 回答
1

我有同样的问题 ;

但最终通过覆盖这种方式修复....

void EnableSpeakerPhone ()
{
UInt32 dataSize = sizeof(CFStringRef);
CFStringRef currentRoute = NULL;
OSStatus result = noErr;

AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, &currentRoute);

// 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, &currentRoute);

// 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 直接调用方法...

于 2012-08-26T06:28:06.280 回答