Трудность записи пиксельного буфера в 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
и проблема теперь исчезла.