Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在使用Avassetrader的iPad上读取视频帧时,图像方向不正确_Ios_Swift_Avfoundation_Avassetreader_Cmsamplebuffer - Fatal编程技术网

Ios 在使用Avassetrader的iPad上读取视频帧时,图像方向不正确

Ios 在使用Avassetrader的iPad上读取视频帧时,图像方向不正确,ios,swift,avfoundation,avassetreader,cmsamplebuffer,Ios,Swift,Avfoundation,Avassetreader,Cmsamplebuffer,我首先要确定几件事: 这可以在多部iPhone(iOS 10.3和11.x)上正常工作 这在任何iPad模拟器(iOS 11.x)上都能正常工作 剩下的情况是,当我运行下面的代码(从我的应用程序中压缩以删除不相关的代码)时,我会得到一个倒置(横向)或旋转90度(纵向)的图像。查看此步骤之前处理的视频表明其方向正确。所有测试均在iOS 11.2.5上完成 *已更新* 我做了一些进一步的测试,发现了一些更有趣的项目: 如果视频是从手机或外部源导入的,则会正确处理 如果视频是以纵向方向在iPad

我首先要确定几件事:

  • 这可以在多部iPhone(iOS 10.3和11.x)上正常工作
  • 这在任何iPad模拟器(iOS 11.x)上都能正常工作
剩下的情况是,当我运行下面的代码(从我的应用程序中压缩以删除不相关的代码)时,我会得到一个倒置(横向)或旋转90度(纵向)的图像。查看此步骤之前处理的视频表明其方向正确。所有测试均在iOS 11.2.5上完成

*已更新*

我做了一些进一步的测试,发现了一些更有趣的项目:

  • 如果视频是从手机或外部源导入的,则会正确处理
  • 如果视频是以纵向方向在iPad上录制的,那么阅读器将其提取出来,并向左旋转90度
  • 如果视频是在iPad上以横向方向录制的,那么阅读器会将其倒置提取
  • 在上述两种情况下,
    UIImage
    报告纵向方向
所涉及代码的浓缩版本:

import UIKit
import AVFoundation

let asset = ...
let assetReader = try? AVAssetReader(asset: asset)

if let assetTrack = asset.tracks(withMediaType: .video).first,
    let assetReader = assetReader {
    let assetReaderOutputSettings = [
        kCVPixelBufferPixelFormatTypeKey as String : NSNumber(value: kCVPixelFormatType_32BGRA)
    ]
    let assetReaderOutput = AVAssetReaderTrackOutput(track: assetTrack,
                                                     outputSettings: assetReaderOutputSettings)
    assetReaderOutput.alwaysCopiesSampleData = false
    assetReader.add(assetReaderOutput)

    var images = [UIImage]()
    assetReader.startReading()

    var sample = assetReaderOutput.copyNextSampleBuffer()

    while (sample != nil) {
        if let image = sample?.uiImage { // The image is inverted here
            images.append(image)
            sample = assetReaderOutput.copyNextSampleBuffer()
        }
    }
    // Continue here with array of images...
}

经过一番探索,我发现了以下几点,这使我能够从
AVAssetTrack
获取视频的方向:

let transform = assetTrack.preferredTransform
radians = atan2(transform.b, transform.a)
一旦我有了它,我就可以把它转换成度:

let degrees = (radians * 180.0) / .pi
然后,使用switch语句,我可以确定如何旋转图像:

Switch Int(degrees) {
   case -90, 90:
       // Rotate accordingly
   case 180:
       // Flip
   default:
       // Do nothing
}

也许是复制品?还是这个@马特:是的,我发现了一些类似的东西,可以让我部分地使用其中所描述的东西。只是为了在发布前得到一个完整的修复。谢谢