Не удалось записать видео с AVAssetWriter - PullRequest
0 голосов
/ 17 июня 2019

Я использую AVAssetWriter для сохранения перекодирования экрана в mp4 (без H.264 видео и aac аудио кодирования). Все работает отлично, как и ожидалось, но некоторые пользователи жаловались на проблему размера видео 0 КБ, то есть данные не записываются в выходной файл. Пытаясь снова и снова, я смог воспроизвести эту проблему. Это произошло после нескольких успешных операций записи (иногда после 2, иногда после 5, а на некоторых машинах этого не происходит) Я сравнил успешный поток и провал посмотрел журналы для него. Единственное, что я узнал, это

CMIO_Unit_Converter_Audio.cpp: 588: Сбой перестроенияAudioConverter AudioConverterSetProperty () (1886547824)

Где

kAudioFormatUnsupportedPropertyError = 1886547824

Что заставляет меня проверять аудиоформат в случае сбоя, но аудиоформат для AVAssetWriter был в полном порядке. Я настраиваю вход звуковой записи как Входы AVAssetWriter

[<AVAssetWriterInput: 0x600002047950, mediaType = vide, outputSettings = {
    AVVideoCodecKey = avc1;
    AVVideoHeightKey = 840;
    AVVideoWidthKey = 1360;
}>, <AVAssetWriterInput: 0x60000205e740, mediaType = soun, outputSettings = {
    AVFormatIDKey = 1633772320;
    AVNumberOfChannelsKey = 2;
    AVSampleRateKey = 44100;
}>]

Мой код для создания AVAssetWriterInput для видео и аудио выглядит следующим образом Аудио AVAssetWriterInput

settings = [
    AVFormatIDKey : kAudioFormatMPEG4AAC,
    AVNumberOfChannelsKey : ch,
    AVSampleRateKey : rate,
]
audioInput = AVAssetWriterInput(mediaType: .audio, outputSettings: settings)

Видео AVAssetWriterInput

var settings: [String : Any] = [
    AVVideoWidthKey  : cx,
    AVVideoHeightKey : cy,
    AVVideoCodecKey  : AVVideoCodecType.h264,
]
videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: settings)

Я заметил, что ошибка в журнале появляется после запуска AVCaptureSession и до AVCaptureVideoDataOutputSampleBufferDelegate captureOutput. Я зарегистрировал входы и выходы AVCaptureSession, а также.

Входы AVCaptureSession

[<AVCaptureScreenInput: 0x6000022e18e0>, <AVCaptureDeviceInput: 0x6000022e0a00 [Built-in Microphone]>]

AVCaptureSession Выходы

[<AVCaptureAudioDataOutput: 0x6000022e1f40>, <AVCaptureVideoDataOutput: 0x60000228b7a0>]

Но опять же я не вижу здесь никаких проблем. Я пытался понять это в течение хороших нескольких дней, но не смог этого сделать. Я понятия не имею, что вызывает это, и даже когда все установлено правильно, он не может записать какой-либо вывод. Это происходит только с видео + аудио, если я пишу видео, только оно работает правильно.

...