如何在纵向模式下通过AVAssetExportSession导出视频资源

时间:2012-04-05 18:55:15

标签: iphone video avfoundation assets avassetexportsession

当我通过AVAssetExportSession导出视频资源时,结果文件处于landspace模式。 (通过itune抓取文件 - > apps->文件共享 - >我的应用)。 如何以纵向模式导出视频资源(旋转)?

2 个答案:

答案 0 :(得分:21)

来自iPhone捕捉设备的视频始终是横向的,无论拍摄时的设备方向如何。

如果您想旋转视频,“简单”解决方案是将转换分配给导出会话的视频轨道。

在AVComposition对象中创建2个可变轨道:

AVMutableCompositionTrack *videoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

将您的媒体曲目添加到乐曲的曲目中:

...        
BOOL videoResult = [videoTrack insertTimeRange:sourceCMTime 
                                       ofTrack:[tracks objectAtIndex:0] 
                                        atTime:currentTime 
                                         error:&error];

BOOL audioResult = [audioTrack insertTimeRange:sourceCMTime 
                                       ofTrack:[tracks objectAtIndex:0] 
                                        atTime:currentTime 
                                         error:&error];
...

添加完所有曲目后,将变换应用于合成的视频曲目:

    CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(M_PI_2);
//    CGAffineTransform rotateTranslate = CGAffineTransformTranslate(rotationTransform,360,0);
    videoTrack.preferredTransform = rotationTransform;

(请注意,变换的左上角为原点,因此旋转后需要平移,但在iPhone 4S,iOS 5.1上进行了测试,现在似乎是围绕中心进行旋转。)

答案 1 :(得分:0)

当U转换轨道同时应该设置合成renderSize,因为它可能不在框架内或以黑色块显示:

self.mutableVideoComposition.renderSize = CGSizeMake(assetVideoTrack.naturalSize.height,assetVideoTrack.naturalSize.width);