【问题标题】:play and record- AudioSessionSetProperty..?播放和录制 - AudioSessionSetProperty..?
【发布时间】:2012-03-20 09:56:48
【问题描述】:

我们的应用程序使用 remoteIO(音频单元)从麦克风获取音频输入,并通过 DSP 实时处理它,它有一个回调函数为我提供缓冲区,我正在处理它。

同时,我们需要通过avAudioPlayer播放声音。

我在我的初始化中输入了这个:(将声音路由到扬声器并让它播放和录制)

UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
        AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

但后来我看到了一些奇怪的东西。声音是从小型扬声器播放出来的——你在打电话时用来戴上耳朵的那个。

然后我做了一个诡计。 我已经看到,为了将声音真正路由到扬声器,我必须播放一些东西并同时执行上面的这 4 行。 如果我这样做 1 次,那么声音会永远回到扬声器。 我用一个调用该方法的计时器来做到这一点,当这个方法执行它们时,我用 avaudioPlayer 播放声音,然后修复它并将声音路由到扬声器。

有人对此有任何解决方案或解释吗? 我真的需要通过扬声器播放声音,没有技巧。

【问题讨论】:

    标签: objective-c avaudioplayer core-audio audiounit


    【解决方案1】:

    它永远播放的原因是麦克风拾取播放的声音并进入循环又名Larsen effect

    您可以使用以下命令将声音强制发送到底部扬声器

    -(void)setSpeaker
    {
        OSStatus error;
        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
        error = AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride), &audioRouteOverride);
        if (error) NSLog(@"Couldn't route audio to speaker");
    }
    

    您还可以通过MPVolumeView向用户展示一个用户界面来选择底部或顶部扬声器

    【讨论】:

      猜你喜欢
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多