2016-02-22 35 views
2

我试图执行CMSampleBuffer的深克隆来存储AVCaptureSession的输出。我在运行函数CMSampleBufferCreateForImageBuffer时收到错误kCMSampleBufferError_InvalidMediaFormat(OSStatus -12743)。我看不出我是如何与CVImageBufferCMSampleBuffer格式描述不匹配的。任何人都知道我出错了吗?她是我的测试代码。在Swift中创建CMSampleBuffer的副本返回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

我能够通过创建一个格式描述过新创建的图像缓冲器,并用它来代替格式描述关原样品缓冲液来解决这个问题。不幸的是,虽然这解决了问题,但格式描述不匹配,导致问题进一步恶化。