在物镜c的x轴上水平翻转视频

时间:2019-01-02 11:46:43

标签: ios avfoundation avvideocomposition

我有两个在视图上同时播放两个视频。两个视频都相同。

现在,我担心的是右侧的视频实际上是沿x轴水平翻转然后保存在照片库中。我尝试了很多搜索,发现CGAFFineRotateTransform可以提供帮助,但我无法在我的代码。请帮助我将视频水平水平翻转,同时保持比例不变并保持不变。

在此方向上的任何帮助或指导都是可取的。谢谢!!

Check the difference between video on left and right,video on left is complete but video on right is showing half video only

1 个答案:

答案 0 :(得分:0)

要水平翻转视频(镜像),请使用负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的{​​{1}}对于某些具有复杂SAR / PAR定义的视频有时会返回令人困惑的结果。为了证明这一点,您必须从相应格式说明中的尺寸中得出尺寸,但这是一个全新的主题...