【问题标题】:Routing audio input to receive from TOP microphone on iPhone路由音频输入以从 iPhone 上的 TOP 麦克风接收
【发布时间】:2012-04-23 00:26:52
【问题描述】:

我正在编写一个小应用程序来录制多首曲目并相互播放。 我正在使用 PlaybackAndRecord 模式,并将我的输出路由到主扬声器。 问题是底部的麦克风仍然用于输入,所以现在我在录制时从其他轨道的输出在新轨道上非常响亮。 这是我目前所拥有的:

audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];    
OSStatus propertySetError = 0;
UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);

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

[audioSession setActive:YES error:nil];

【问题讨论】:

  • 什么是“顶部”麦克风?
  • iPhone 底部有一个麦克风,嵌入扬声器中。 iPhone的顶部还有一个麦克风,它在耳机插孔旁边是一个小整体。它用于降噪,也用于免提电话。

标签: iphone ios xcode4 avfoundation


【解决方案1】:

使用 AVAudioSession 获取可用的输入。在我的 iPhone 5 上看起来像这样。

NSLog(@"%@", [AVAudioSession sharedInstance].availableInputs);

  "<AVAudioSessionPortDescription: 0x14554400, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = Back>"

然后使用这些输入之一来获取可用的数据源,就像这样。

NSLog(@"%@", [AVAudioSession sharedInstance].availableInputs[0].dataSources);

  "<AVAudioSessionDataSourceDescription: 0x145afb00, ID = 1835216945; name = Bottom>",
  "<AVAudioSessionDataSourceDescription: 0x145b1870, ID = 1835216946; name = Front>",
  "<AVAudioSessionDataSourceDescription: 0x145b3650, ID = 1835216947; name = Back>"

我们可以看到,这款 iPhone 上实际上有三个麦克风:顶部正面、顶部背面和底部。现在您可以设置首选数据源了。

AVAudioSessionPortDescription *port = [AVAudioSession sharedInstance].availableInputs[0];
for (AVAudioSessionDataSourceDescription *source in port.dataSources) {
    if ([source.dataSourceName isEqualToString:@"Back"]) {
        [port setPreferredDataSource:source error:nil];
    }
}

【讨论】:

  • 请注意,上述解决方案仅适用于手机语言环境为 EN(英语) - 因为 dataSourceName 已本地化。因此,所有可能值的比较都将失败。在 iOS7 上,您应该使用方向属性(例如 AVAudioSessionOrientationBack)。对于较旧的 iOS 版本,您最好检查系统 ID 值。
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
相关资源
最近更新 更多