首页 文章

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

提问于
浏览
0

我通过扬声器回放音乐问题。我在以下链接如何将 AVAudioPlayer 输出到扬声器中找到了一个例子,但问题是如何确保我通过“扬声器”成功实现了播放音乐?我把代码编写为链接,但在 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 应该是“耳机”或“扬声器”如果我粘贴的代码是正确的,我仍然无法制作,我激活扬声器的方式是正确的。你能帮助我吗?

2 回答

  • 3

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

    只需检查kAudioSessionProperty_AudioRoute设置为什么。

    Apple 声明:

    kAudioSessionProperty_AudioRoute...当前音频路径的名称(例如“耳机”,“扬声器”等)。一个 read-only CFStringRef 值。

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

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

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

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

    另见 kAudioSessionProperty_OverrideAudioRoute。

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

相关问题