【问题标题】:UIImagePickerController: Getting image capture from videoUIImagePickerController:从视频中获取图像捕获
【发布时间】:2011-02-16 22:58:53
【问题描述】:

我正在尝试从视频中提取帧作为图像。使用 UIImagePickerController 录制视频。

录制完视频后,我会获取其 URL 并使用 AVURLAsset 加载它。然后我创建一个 AVAssetReader 和 AVAssetReaderTrackOutput 来获取各个帧。

当我将帧作为 CMSampleBufferRef 获取时,我将它们传递给 Apple 的 imageFromSampleBuffer 方法,该方法应该返回一个 UIImage。当我使用 AVCaptureSession 获取帧时,此方法运行良好,但是当我使用通过 UIImagePickerController 录制的视频时,此行返回 0x0:

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

其中 sampleBuffer 是我通过的 CMSampleBufferRed。

我通过调试器检查了 sampleBuffer 的值,它看起来没问题(不是 0x0)。 CMSampleBufferGetImageBuffer 会返回 0x0 有什么原因吗?

或者还有其他方法可以从 MOV 文件中提取单个视频帧并将其保存为 UIImage?

谢谢。

【问题讨论】:

    标签: ios video uiimagepickercontroller frame avfoundation


    【解决方案1】:

    我找到了解决方案。您必须在初始化 AVAssetReaderTrackOutput 时传递的设置中设置像素格式。

    我通过了以下设置字典:

    NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
    NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
    NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 
    

    希望这对其他人有所帮助。

    【讨论】:

      【解决方案2】:

      我前段时间就是这样做的。

          func getPicture() -> UIImage {
      
      
      
              let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
      
              var videoWidth = CVPixelBufferGetWidth(imageBuffer)
              var videoHeight = CVPixelBufferGetHeight(imageBuffer)
      
      
      
              CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
      
              // Creating an image from a imageBuffer, a frame.
              let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer)
              let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer) 
              let colorSpace  = CGColorSpaceCreateDeviceRGB()  
              var bitmapInfo  = CGBitmapInfo.byteOrder32Little.rawValue
              bitmapInfo |= CGImageAlphaInfo.premultipliedFirst.rawValue 
      
      
              let context = CGContext(data: baseAddress, width: videoWidth, height: videoHeight, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo)!
      
              let frameImage =   context.makeImage()!  // This is a CGImage
              let image =  UIImage(cgImage: frameImage) 
      
              return image
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        相关资源
        最近更新 更多