AVPlayerLayer中显示的AVAssetTrack显示不正确

时间:2015-12-01 00:39:42

标签: ios swift avfoundation

我的设置非常简单。我有一个带有视频和音轨的作文。视频以左或右横向方向捕获。使用AVCaptureVideoDataOutput对象捕获视频帧缓冲区,并使用AVAssetWriter / AVAssetWriterInput对象写入。然后,这些视频将显示在AVPlayerLayer中。

我根据设备方向设置编写器输入的变换。

if UIDevice.currentDevice.orientation == UIDeviceOrientation.LandscapeRight {
  videoWriterVideoInput.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
}

在Quicktime中查看输出视频如下所示: enter image description here

接下来,此视频显示在AVPlayerLayer中:

enter image description here

使用AVAssetExportSession导出AVMutableComposition也会导致视频翻转180度。

我无法在合成的视频轨道上设置preferredTransform,因为视频将以横向左或右方向录制。

2 个答案:

答案 0 :(得分:2)

我相信您需要设置连接的方向,以便您对EXIF数据有正确的方向。如果是责备EXIF(元数据),那就可以解释为什么它在QuickTime中正确显示而在iOS中没有显示。

这样的事情:

self.captureConnection.setVideoOrientation(UIDevice.currentDevice.orientation)

答案 1 :(得分:1)

您缺少一些细节,但我会引导您完成一个对我有用的基本过程:

在我开始视频捕获之前,我调用了一个委托方法来设置AVAssetWriter和其他一些东西。在这个方法中我:

AVCaptureConnection *videoConnection = [_myCaptureVideoDataOutput connectionWithMediaType:AVMediaTypeVideo];

// you can use the devices orientation or force one here with a switch statement or something
[videoConnection setVideoOrientation:UIDevice.currentDevice.orientation];

此代码(显然包含所有设置)并简单地调用_assetWriterVideoInput.transform = CGAffineTransformIdentity;代替我完全正常。有很多地方可能会出错,如果没有更多信息很难说,但希望这会有所帮助。我担心你在自动使用输出样本缓冲区的AVVideoConnection集时会应用额外的变换。