Трудность записи пиксельного буфера в Asset Writer на некоторых устройствах

Я работаю над функцией в моем приложении для записи изображений из буфера семплов в AVAssetWriter. Любопытно, что это нормально работает на 10,5-дюймовом iPad Pro, но вызывает сбой на 7,9-дюймовом iPad Mini 2. Я не могу понять, как один и тот же код может быть проблематичным на двух разных устройствах. Но вот мой код;

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

    // Setup the pixel buffer image
    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!

    // Setup the format description
    let formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer)!

    // Setup the current video dimensions
    self.currentVideoDimensions = CMVideoFormatDescriptionGetDimensions(formatDescription)

    // Setup the current sample time
    self.currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer)

    // Handle record
    if self.isCapturing {

        // Setup auto release pool
        autoreleasepool {

            // Setup the output image
            let outputImage = CIImage(cvPixelBuffer: pixelBuffer)

            // Ensure the video writer is ready for more data
            if self.videoWriter?.assetWriterPixelBufferInput?.assetWriterInput.isReadyForMoreMediaData == true {

                // Setup the new pixel buffer (THIS IS WHERE THE ERROR OCCURS)
                var newPixelBuffer: CVPixelBuffer? = nil

                // Setup the pixel buffer pool
                CVPixelBufferPoolCreatePixelBuffer(nil, (self.videoWriter?.assetWriterPixelBufferInput!.pixelBufferPool!)!, &newPixelBuffer)

                // Render the image to context
                self.context.render(outputImage, to: newPixelBuffer!, bounds: outputImage.extent, colorSpace: nil)

                // Setup a success case
                let success = self.videoWriter?.assetWriterPixelBufferInput?.append(newPixelBuffer!, withPresentationTime: self.currentSampleTime!)

                // Ensure the success case exists
                guard let mySuccess = success else { return }

                // If unsuccessful, log
                if !mySuccess {
                    print("Error with the sample buffer.  Check for dropped frames.")
                }
            }
        }
    }
}

Я получаю сообщение об ошибке, что newPixelBuffer равен нулю, но опять же, только на 7,9" iPad. IPad Pro работает без ошибок. Есть мысли? Спасибо!

1 ответ

В конце концов я решил эту проблему, отследив ее до выбранного кодека в настройках вывода видео моего Asset Writer. Мой кодек был установлен на:

let codec: AVVideoCodecType = AVVideoCodecType.hevc

Проведя некоторые исследования, я обнаружил эту статью, которая указывает, что только определенные устройства могут захватывать медиа в HEVC. Поскольку моим первым устройством был 10,5-дюймовый iPad Pro, он без проблем захватывал мультимедиа. Вторым моим устройством был iPad Mini, в результате чего исходная проблема возникала при каждой попытке захвата.

С тех пор я изменил свой выбор кодека на:

let codec: AVVideoCodecType = AVVideoCodecType.h264и проблема теперь исчезла.

Другие вопросы по тегам