我使用 AVFoundation 创建了一个相机,它能够使用以下命令录制视频和音频AVCaptureVideoDataOutput
and AVCaptureAudioDataOutput
。我创建捕获会话,连接所有输入以及视频和音频数据输出,然后相机闲置。用户现在可以开始视频录制。
Problem
问题是,在我开始捕获会话后(captureSession.startRunning()
),背景音乐断断续续。我认为这是因为一旦捕获会话开始运行,AVCaptureAudioDataOutput
内部激活 AVAudioSession (AVAudioSession.setActive(...)),我不希望它这样做。我希望它处于空闲状态(并且不提供任何音频输出缓冲区),直到我明确激活音频会话(一旦用户开始录制)。
这真的很烦人,因为相机是我们应用程序中的开始屏幕,每次用户打开或关闭应用程序时,他的音乐都会断断续续。
我知道这在某种程度上是可能的,因为 Snapchat 就是这样工作的——你打开应用程序,背景音频就会继续流畅地播放。开始录制后,背景音乐会出现轻微的卡顿,但相机会平稳运行,并在短暂的卡顿结束后开始录制。
My code:
func configureSession() {
captureSession.beginConfiguration()
// Video, Photo and Audio Inputs
...
// Video Output
...
// Audio Output
audioOutput = AVCaptureAudioDataOutput()
guard captureSession.canAddOutput(audioOutput!) else {
throw CameraError.parameter(.unsupportedOutput(outputDescriptor: "audio-output"))
}
audioOutput!.setSampleBufferDelegate(self, queue: audioQueue)
captureSession.addOutput(audioOutput!)
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playAndRecord,
options: [.mixWithOthers,
.allowBluetoothA2DP,
.defaultToSpeaker,
.allowAirPlay])
captureSession.commitConfiguration()
}
我尝试过的
延迟配置AVAudioSession.sharedInstance()
我尝试首先配置AVAudioSession.sharedInstance
与类别AVAudioSession.Category.playback
,然后切换到.playAndRecord
一旦我想开始录制音频。
这不起作用,并且AVCaptureSessionRuntimeError
启动相机后立即调用事件并显示错误代码-10851
, 意思是kAudioUnitErr_InvalidPropertyValue
。我认为这意味着AVCaptureAudioDataOutput
不允许从音频会话进行录制,但我现在不想这样做 - 它应该处于空闲状态。
延迟添加AVCaptureAudioDataOutput
output
我尝试不添加音频输出(AVCaptureAudioDataOutput
)在开始时,只有在用户开始录音时才“按需”添加它,虽然这对于背景音乐效果很好(开始时没有口吃,一旦用户开始录音只有短暂的口吃,这正是我想要的) ,它使预览冻结了很短的时间(因为捕获会话正在通过重新配置beginConfiguration
+ 音频输出添加 +commitConfiguration
)
有谁知道如何实现我在这里想要做的事情 - 或者 Snapchat 是如何做到的?任何帮助表示感谢,谢谢!