如何将AVAudioPlayer输出到扬声器,并验证我在iphone模拟器上是否正确?

如何将AVAudioPlayer输出到扬声器,并验证我在iphone模拟器上是否正确?,iphone,ios-simulator,avaudioplayer,speaker,Iphone,Ios Simulator,Avaudioplayer,Speaker,我有一些关于通过扬声器播放音乐的问题。 我在下面的链接中找到了一个例子 但问题是如何确保我成功实现了通过“扬声器”播放音乐? 我写的代码作为链接,但它似乎没有什么不同之前和之后,我激活了 iphone模拟器上的“扬声器”(在macbook上) 更新: 下面是我激活扬声器的方式 UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord ; // 1 AudioSessionSetProperty ( k

我有一些关于通过扬声器播放音乐的问题。 我在下面的链接中找到了一个例子 但问题是如何确保我成功实现了通过“扬声器”播放音乐? 我写的代码作为链接,但它似乎没有什么不同之前和之后,我激活了 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的值是合理的

正如你所说,KaudioSession\u AudioRoute应该是“耳机”或“扬声器” 我仍然无法确定我粘贴的代码是否正确,以及我激活扬声器的方式是否正确。
你能帮我吗?

你的macbook只有一套扬声器,所以你只能从那里听到。手机底部有听筒和扬声器(您想使用)

只需检查
kAudioSessionProperty\u AudioRoute
设置为什么

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

有关“替代到扬声器”属性的详细信息:

此属性只能用于kAudioSessionCategory_PlayAndRecord(或等效的AVAudioSessionCategoryRecord)类别。(…)默认情况下,此类别的输出音频将发送到接收器,即您在通话时挂在耳朵上的扬声器。kAudioSessionOverrideAudioRoute_扬声器常数允许您将输出音频定向到位于手机底部的扬声器

kAudioSessionProperty_重写类别DefaultToSpeaker。。指定在未连接其他音频路由(如耳机)时,是否将音频路由到扬声器(而不是接收器)。默认情况下,此属性的值为FALSE(0)。读/写UInt32值

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

另请参见kAudioSessionProperty_OverrideAudioRoute


你的macbook只有一套扬声器,所以你只能从中听到。手机底部有听筒和扬声器(您想使用)

只需检查
kAudioSessionProperty\u AudioRoute
设置为什么

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

有关“替代到扬声器”属性的详细信息:

此属性只能用于kAudioSessionCategory_PlayAndRecord(或等效的AVAudioSessionCategoryRecord)类别。(…)默认情况下,此类别的输出音频将发送到接收器,即您在通话时挂在耳朵上的扬声器。kAudioSessionOverrideAudioRoute_扬声器常数允许您将输出音频定向到位于手机底部的扬声器

kAudioSessionProperty_重写类别DefaultToSpeaker。。指定在未连接其他音频路由(如耳机)时,是否将音频路由到扬声器(而不是接收器)。默认情况下,此属性的值为FALSE(0)。读/写UInt32值

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

另请参见kAudioSessionProperty_OverrideAudioRoute


我也有同样的问题

但最终通过这种方式进行了修正

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)方法


现在,让切换器或任何btn直接调用这些方法…

我也有同样的问题

但最终通过这种方式进行了修正

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)方法

现在,让切换器或任何btn直接调用这些方法