视频录制应用。我希望它能够在不停止/暂停背景音乐的情况下工作(例如,当用户收听Apple Music时)。我可以很好地将mixWithOthers
单AVAudioSession
上的类别设置为<{1}}。
设置类别后,我还需要将AVCaptureDeviceInput
添加到AVCaptureSession
(因此会录制音频)。这会导致背景音频出现故障/打嗝,也会导致视频重置/重新聚焦。
我已经调查过,似乎背景音频故障是无法避免的,但视频在添加输入时不应重置。视频重置的结果是录制视频的第一帧是暗/黑色,或者从失焦帧开始然后聚焦。
同时检查Snapchat ios应用程序,他们在开始录制时也有音频故障,但视频开始顺利录制。我做错了什么。
我的代码:
//Setting audio session to mixWithOthers upon startup
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(AVAudioSessionCategoryPlayAndRecord,
with: [.mixWithOthers])
if session.mode != AVAudioSessionModeVideoRecording {
try session.setMode(AVAudioSessionModeVideoRecording)
}
} catch let error {
print("avsession category error: \(error)")
}
然后:
//Just before recording starts will add audio input
let audioDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio)
do
{
let deviceInput = try AVCaptureDeviceInput(device: audioDevice) as AVCaptureDeviceInput
if captureSession.canAddInput(deviceInput) {
captureSession.addInput(deviceInput)
}
else {
print("Could not add audio device input to the session")
}
}
catch let error as NSError {
print(error.localizedDescription)
return
}
是否有可能在没有任何故障的情况下这样做? 如果没有那么我怎么能使它至少像Snapchat(在addInput调用时没有视频重置)?
答案 0 :(得分:1)
我注意到AVCaptureSession addInput
重置AVAudioSession AVAudioSessionCategory(Solo)Ambient
类别设置的沉默
Category Silenced Interrupts
AVAudioSessionCategoryAmbient Yes No
AVAudioSessionCategorySoloAmbient Yes Yes
AVAudioSessionCategoryMultiRoute No Yes
AVAudioSessionCategoryPlayAndRecord No Yes
AVAudioSessionCategoryPlayback No Yes
AVAudioSessionCategoryRecord No Yes
当用户将静音开关(或iPhone上的响铃/静音开关)移动到“静音”位置时,音频会静音。
AVAudioSessionCategoryAmbient
- 仅限播放。播放声音增加了抛光或兴趣,但对应用程序的使用并不重要。使用此类别,您的音频将通过振铃/静音开关以及屏幕锁定时静音。
AVAudioSessionCategorySoloAmbient
- (默认)仅播放。当用户将振铃/静音开关切换到“静音”位置并且屏幕锁定时,音频静音。此类别与AVAudioSessionCategoryAmbient
类别的不同之处仅在于它会中断其他音频。
答案 1 :(得分:-1)
所以从你的问题来看,这句话具体是:
视频重置的结果是录制视频的第一帧是暗/黑色,或者从失焦帧开始然后聚焦。
表示您在开始录制视频后添加了audioInput
。是否可以在视频开始录制之前添加audioInput
设备?我想,当添加另一个输入源时,视频的预期行为会“冻结”,因为AVCaptureSession
基本上只接受输入和输出文件,或多或少。我想在录制之前添加audioInput
设备可以解决最终产品中的问题,因为该操作不会在录制中结束! :)
提到的另一个评论是:
您是否在更改输入之前在会话上调用beginConfiguration / commitConfiguration?
- SeanLintern88 4月10日15:30
我认为问题作者没有解决这个问题,也可能是问题的原因。如this question/answer所示,您需要在audioInput
来电之间添加begin/commit configuration
设备。
一般来说,我发现核心Apple docs非常有用,而且可能会有更多信息可以提供更多您可能想做的事情。