Подтвердить что ты не робот

Добавление AVCaptureDeviceInput в CaptureSession сбрасывает/перенаправляет видео

Приложение для записи видео. Я хочу, чтобы он работал без остановки/приостановки фоновой музыки (например, когда пользователь прослушивает Apple Music). Это можно сделать с настройкой категории mixWithOthers на AVAudioSession singleton.

После установки категории я также должен добавить AVCaptureDeviceInput в AVCaptureSession (так что звук будет записан). Это приводит к сбою/искажению фонового звука, а также к сбросу/переоценке видео.

Я исследовал, и кажется, что фоновый звуковой сбой - это то, чего нельзя избежать, но при добавлении ввода видео не должно reset. Результатом сброса видео является то, что первый кадр записанного видео либо темный/черный, либо начинается с фокусного кадра, а затем фокусируется.

Также проверено приложение 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 (нет видео reset при вызове addInput)?

4b9b3361

Ответ 1

Я заметил, что AVCaptureSession addInput сбрасывает тишину, установленную AVAudioSession AVAudioSessionCategory(Solo)Ambient category

 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

Когда пользователь перемещает переключатель Silent (или Ring/Silent на iPhone) в положение "без звука", ваш звук отключается.

AVAudioSessionCategoryAmbient - только воспроизведение. Воспроизводит звуки, которые добавляют блеск или интерес, но не являются существенными для использования приложений. Используя эту категорию, ваш звук отключается переключателем Ring/Silent и когда экран блокируется.

AVAudioSessionCategorySoloAmbient - (Только по умолчанию) Только воспроизведение. Тишина звука, когда пользователь переключает переключатель "Кольцо/Без звука" в положение "без звука" и когда экран блокируется. Эта категория отличается от категории AVAudioSessionCategoryAmbient только тем, что она прерывает другой звук.

Ответ 2

Итак, из вашего вопроса, это предложение конкретно:

Результатом сброса видео является то, что первый кадр записанного видео является темным/черным или начинается с кадра вне фокуса, а затем фокусируется.

Указывает на то, что вы добавляете audioInput после начала видеозаписи. Можно ли добавить устройство audioInput до начала записи видео? Я предполагаю, что ожидаемое поведение для видео "замораживается" при добавлении другого источника ввода, поскольку AVCaptureSession по существу просто принимает входы и выводит файл более или менее. Я бы предположил, что добавление устройства audioInput перед записью решит эту проблему в конечном продукте, так как это действие не закончится в записи!:)

Еще один комментарий, который был упомянут:

Вы вызываете startConfiguration/commitConfiguration в сеансе перед изменением входов?

- SeanLintern88 10 апреля в 15:30

Я думаю, что этот вопрос не был затронут автором вопроса, а также может быть причиной проблем. Как показано в этом вопросе/ответе, вам нужно добавить устройство audioInput между вызовом begin/commit configuration.

В общем, я считаю, что ядро ​​Apple docs очень полезно и, вероятно, будет иметь больше информации о других вещах, которые вы, вероятно, захотите делать.