我有两个在一个视图上同时播放两个视频。两个视频都是一样的。
现在,我担心的是右边的视频实际上是沿 x 轴水平翻转,然后保存在照片库中。我尝试了很多谷歌搜索,发现 CGAFFineRotateTransform 可以提供帮助,但我无法在我的代码中使用它。请帮助我水平翻转视频,同时保持比例和移动相同。
在这个方向上的任何帮助或指导都将是可观的。提前致谢!
我有两个在一个视图上同时播放两个视频。两个视频都是一样的。
现在,我担心的是右边的视频实际上是沿 x 轴水平翻转,然后保存在照片库中。我尝试了很多谷歌搜索,发现 CGAFFineRotateTransform 可以提供帮助,但我无法在我的代码中使用它。请帮助我水平翻转视频,同时保持比例和移动相同。
在这个方向上的任何帮助或指导都将是可观的。提前致谢!
要仅水平翻转(镜像)视频,请使用负 x 值进行缩放:
CGAffineTransform scale = CGAffineTransformMakeScale( -1.0, 1.0);
编辑:关于如何定位轨道的更一般的问题:对于涉及的每个视频轨道:
然后,您可以使用如下函数导出相应的仿射变换:
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
我特意选择从单位矩阵开始,然后逐个添加所需的变换。这样可以构建更复杂的变换,包括旋转。正如我所说,尝试掌握仿射变换,它们真的很强大AVAssetTrack
对于某些具有复杂 SAR/PAR 定义的视频, snaturalSize
有时会返回令人困惑的结果。要做到这一点,您必须从相应格式描述中的尺寸得出尺寸,但这是一个全新的话题......