2016-02-22 17 views
2

Я пытаюсь выполнить глубокий клон CMSampleBuffer для хранения вывода AVCaptureSession. Я получаю ошибку kCMSampleBufferError_InvalidMediaFormat(OSStatus -12743) при запуске функции CMSampleBufferCreateForImageBuffer. Я не вижу, как я не согласен с CVImageBuffer и описанием формата CMSampleBuffer. Кто-нибудь знает, где я ошибся? Это мой тестовый код.Создание копии CMSampleBuffer в Swift возвращает OSStatus -12743 (Недопустимый формат носителя)

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { 

    let allocator: CFAllocator = CFAllocatorGetDefault().takeRetainedValue() 

    func cloneImageBuffer(imageBuffer: CVImageBuffer!) -> CVImageBuffer? { 
     CVPixelBufferLockBaseAddress(imageBuffer, 0) 
     let bytesPerRow: size_t = CVPixelBufferGetBytesPerRow(imageBuffer) 
     let width: size_t = CVPixelBufferGetWidth(imageBuffer) 
     let height: size_t = CVPixelBufferGetHeight(imageBuffer) 
     let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer) 
     let pixelFormatType = CVPixelBufferGetPixelFormatType(imageBuffer) 

     let data = NSMutableData(bytes: baseAddress, length: bytesPerRow * height) 
     CVPixelBufferUnlockBaseAddress(imageBuffer, 0) 

     var clonedImageBuffer: CVPixelBuffer? 
     let refCon = NSMutableData() 

     if CVPixelBufferCreateWithBytes(allocator, width, height, pixelFormatType, data.mutableBytes, bytesPerRow, nil, refCon.mutableBytes, nil, &clonedImageBuffer) == noErr { 
      return clonedImageBuffer 
     } else { 
      return nil 
     } 
    } 

    if let oldImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) { 
     if let newImageBuffer = cloneImageBuffer(oldImageBuffer) { 
      if let formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer) { 
       let dataIsReady = CMSampleBufferDataIsReady(sampleBuffer) 
       let refCon = NSMutableData() 
       var timingInfo: CMSampleTimingInfo = kCMTimingInfoInvalid 
       let timingInfoSuccess = CMSampleBufferGetSampleTimingInfo(sampleBuffer, 0, &timingInfo) 
       if timingInfoSuccess == noErr { 
        var newSampleBuffer: CMSampleBuffer? 
        let success = CMSampleBufferCreateForImageBuffer(allocator, newImageBuffer, dataIsReady, nil, refCon.mutableBytes, formatDescription, &timingInfo, &newSampleBuffer) 
        if success == noErr { 
         bufferArray.append(newSampleBuffer!) 
        } else { 
         NSLog("Failed to create new image buffer. Error: \(success)") 
        } 
       } else { 
        NSLog("Failed to get timing info. Error: \(timingInfoSuccess)") 
       } 
      } 
     } 
    } 
} 

ответ

2

Я был в состоянии решить эту проблему путем создания описания формата выключение вновь созданный буфера изображения и использовать его вместо описания формата с оригиналом буфера для образца. К сожалению, в то время как эта проблема устраняет проблему, описания формата не соответствуют друг другу и приводят к дальнейшим проблемам.