如何通过AVAssetExportSession以竖屏模式导出视频资产

7

当我通过AVAssetExportSession导出视频资产时,结果文件是横向模式(通过iTunes->应用程序->文件共享->我的应用抓取文件)。 如何将视频资产导出为纵向模式(旋转它)?

2个回答

22

来自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上测试,似乎现在的旋转是围绕中心进行的。


我试试看。这个是用来改变视频旋转度数的,如果您的播放器(例如QuickTime)支持旋转的元数据,那么您可以获得纵向视频。但原始像素缓冲仍然是横向的。 - CloudTuan
1
原始像素缓冲区在iPhone/iPad(甚至是Android)上始终只能是横向的。只有元数据可以告诉播放器将其旋转显示。如果您想要一个竖屏的电影文件或原始像素缓冲区,我认为您将不得不编写自己的编码器,这将是很多工作。 - Nicolas Buquet
嗨@NicolasBuquet,你能帮我回答一下我的问题吗?https://stackoverflow.com/questions/55771275/duet-merge-2-videos-side-by-side - Ahtazaz

0

当您同时转换轨道时,应设置组合渲染大小,因为它可能超出帧或出现黑块:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接