要仅水平翻转(镜像)视频,请使用负 x 值进行缩放:
CGAffineTransform scale = CGAffineTransformMakeScale( -1.0, 1.0);
编辑:关于如何定位轨道的更一般性问题:对于涉及的每个视频轨道:
- 根据轨道的原始大小构建边界矩形 - 这是源矩形
- 问问自己轨道应该在哪里结束,就结果视频的来源和大小而言 - 这会给你目标 rect
然后您可以使用如下函数导出相应的仿射变换:
CGAffineTransform NHB_CGAffineTransformMakeRectToRect( CGRect srcRect, CGRect dstRect)
{
CGAffineTransform t = CGAffineTransformIdentity;
t = CGAffineTransformTranslate( t, dstRect.origin.x - fmin( 0., dstRect.size.width), dstRect.origin.y - fmin( 0., dstRect.size.height));
t = CGAffineTransformScale( t, dstRect.size.width / srcRect.size.width, dstRect.size.height / srcRect.size.height);
return t;
}
要镜像,请为相应的轴提供负尺寸(- fmin(,) 部分补偿偏移)。
给定一个视频轨道并假设,例如,轨道应该镜像到 640x480 视频的右半部分,您可以通过以下方式获得相应的变换:
CGSize srcSize = videoTrack.naturalSize;
CGRect srcRect = CGRectMake( 0, 0, srcSize.width, srcSize.height);
CGRect dstRect = CGRectMake( 320, 0, -320, 480);
CGAffineTransform t = NHB_CGAffineTransformMakeRectToRect(srcRect, dstRect);
当然这可能会拉伸视频轨道;为了保持纵横比,在计算目标矩形时必须考虑源大小。
一些备注:
- 注意,在
NHB_CGAffineTransformMakeRectToRect 中我特意选择从单位矩阵开始,然后逐一添加所需的变换。这样可以构建更复杂的变换,包括旋转。正如我所说,尝试掌握仿射变换,它们真的很强大
-
AVAssetTracks naturalSize 有时会为某些具有复杂 SAR/PAR 定义的视频返回令人困惑的结果。为了证明这一点,您必须从相应格式说明中的尺寸得出尺寸,但这是一个全新的话题......