将AVCaptureDeviceInput添加到CaptureSession会重置/重新聚焦视频

时间:2017-03-22 11:14:35

标签: ios swift avaudiosession

视频录制应用。我希望它能够在不停止/暂停背景音乐的情况下工作(例如,当用户收听Apple Music时)。我可以很好地将mixWithOthersAVAudioSession上的类别设置为<{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调用时没有视频重置)?

2 个答案:

答案 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

https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html

  

当用户将静音开关(或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非常有用,而且可能会有更多信息可以提供更多您可能想做的事情。