如何解决 iOS 中的 AVCaptureSession v AVAudioSession 冲突?

Posted

技术标签:

【中文标题】如何解决 iOS 中的 AVCaptureSession v AVAudioSession 冲突?【英文标题】:How to resolve AVCaptureSession v AVAudioSession conflict in iOS? 【发布时间】:2012-05-06 17:25:13 【问题描述】:

我正在尝试在视图控制器中运行 AVCaptureSession,但在同一个视图中,我还从使用 AVAudiosession 的库中调用了一个函数。我似乎无法从调试器中获得太多信息,除了它在我调用这个特定库的函数时完全崩溃。库是 libpd:

https://github.com/libpd

它调用 AVAudioSession 作为 sharedInstance。我称 libpd 为:

[self.audioController configurePlaybackWithSampleRate:44100 numberChannels:2 inputEnabled:YES mixingEnabled:YES]

所以启用了混合,但以防万一,我重新编译了它,以便在它初始化时,我这样做:

    UInt32 doSetProperty = 1;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers,  sizeof(doSetProperty), &doSetProperty);

但是,没有运气。将 libpd 的调用移动到视图控制器中的 viewWillAppear 也不起作用。但是,如果我将调用 libpd 的代码从我的视图控制器中取出,并将其放入 didFinishLaunchingWithOptions 内的应用程序委托中,它就会正常启动,并且两个会话似乎可以共存而不会崩溃。

我是否缺少有关 AVCaptureSession 和混音的内容?如何让两个会话共存?我没有使用 AVCapture 来捕获音频,只使用相机输入,所以我不应该以某种方式同时进行吗?

【问题讨论】:

【参考方案1】:

启动摄像头会话后,启动音频会话(可以设置为支持混音)。我试过了,您需要等待相机设置好才能开始音频会话(例如等待几秒钟)

【讨论】:

虽然我可以通过主动将 AVAudioSession 从 AVAudioSessionCategoryPlayAndRecord 切换到 AVAudioSessionCategoryAmbient 并在调用我的 AVCaptureSession 上的 startRunning 并调用 stopRunning 之前将其设置为活动来来回切换,但我一直无法让它工作在将音频会话切换回播放和录制之前的捕获会话...啊,但也许我应该在尝试混合 AVAudioSession 之前等待发布 AVCaptureSessionDidStartRunningNotification?【参考方案2】:

库是否有可能假设没有其他音频会话处于活动状态并调用AudioSessionInitialize

Per the docs “您可以根据需要激活和停用音频会话(请参阅 AudioSessionSetActive),但应该只初始化一次。”

我猜这个库的作者并没有包含正在进行的音频会话的功能......但是只要你的应用程序总是点击,潜入那里并注释掉初始化行就很容易了该函数调用正在运行的音频会话(否则只需检查if 语句以查看您是否有音频会话,如果没有,则初始化一个等)

【讨论】:

以上是关于如何解决 iOS 中的 AVCaptureSession v AVAudioSession 冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决ios中第3方框架中的重复符号?

如何解决官方 iOS 应用开发教程中的 Auto Layout 问题?

PhoneGap:iOS 7 中的 UIPickerView 不会像在 iOS 6 中那样自动调整字体大小。关于如何在 iOS 7 中实现的任何解决方案?

如何解决 iOS App 中的内存泄漏问题?

如何解决 micronaut 应用程序中的错误“没有 [io.micronaut.data.operations.PrimaryRepositoryOperations] 类型的 bean”?

当触发 iOS Safari 中的虚拟键盘时,它会使我的 CSS 过渡闪烁。如何解决这个问题?