Ios AVAsset到CIDetectorImageOrientation

Ios AVAsset到CIDetectorImageOrientation,ios,swift,Ios,Swift,我想在AVAsset中的每一帧上使用CoreImage运行人脸检测,为此,我需要该资源中每个样本缓冲区的CIDetectorImageOrientation 问题是,如果我将CMSampleBuffer转换为UIImage,并使用以下命令将该图像转换为exif方向: var exifOrientation: UInt32 { switch self.imageOrientation { case .Up: return 1 case .Down: return 3

我想在AVAsset中的每一帧上使用CoreImage运行人脸检测,为此,我需要该资源中每个样本缓冲区的CIDetectorImageOrientation

问题是,如果我将CMSampleBuffer转换为UIImage,并使用以下命令将该图像转换为exif方向:

var exifOrientation: UInt32 {
    switch self.imageOrientation {
    case .Up: return 1
    case .Down: return 3
    case .Left: return 8
    case .Right: return 6
    case .UpMirrored: return 2
    case .DownMirrored: return 4
    case .LeftMirrored: return 5
    case .RightMirrored: return 7
    }
}
方向始终为.Up,无论视频是如何从前后摄像头拍摄的,还是视频拍摄的方向


如何正确获取CMSampleBuffer的CIDetectorImageOrientation?

您需要获取该资源的视频轨迹方向。每个帧的方向都相同。 下面是在目标C中的大致操作方法

AVAssetTrack *videoTrack =[asset tracksWithMediaType:AVMediaTypeVideo].firstObject;
CGSize size = [videoTrack naturalSize];
CGAffineTransform preferredTransform = [videoTrack preferredTransform];

if (size.width == preferredTransform.tx && size.height == preferredTransform.ty) {
  return kCGImagePropertyOrientationRight;
} else if (preferredTransform.tx == 0 && preferredTransform.ty == 0) {
  return kCGImagePropertyOrientationUpLeft;
} else if (preferredTransform.tx == 0 && preferredTransform.ty == size.width) {
  return kCGImagePropertyOrientationDown;
}
...