在 objective c 内沿 x 轴水平翻转视频

Flip video horizontally on x- axis in objective c

我有两个在一个视图中同时播放两个视频。两个视频应该是一样的。

现在,我担心的是右边的视频实际上是沿 x 轴水平翻转,然后保存在照片中 library.I 尝试了很多谷歌搜索,发现 CGAFFineRotateTransform 可以提供帮助,但我做不到在我的 code.Kindly 中使用它帮助我水平翻转视频,同时保持比例和移动相同。

在这方面的任何帮助或指导将不胜感激。提前致谢!

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

要水平翻转(镜像)视频,请使用负 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中我特意选择了从单位矩阵开始,然后将需要的transforms一一添加。这样可以构建更复杂的变换,包括旋转。正如我所说,尝试掌握仿射变换,它们真的很强大
  • AVAssetTracks naturalSize 某些具有复杂 SAR/PAR 定义的视频有时会 returns 令人困惑的结果。要做到这一点,您必须从相应格式描述中的尺寸中推导出尺寸,但这是一个全新的话题...