如何在iOS中动态更改视频的播放速率?

11 video opengl-es playback avfoundation ios

我想要实现的完美示例可以在Flow●Slow and Fast Motion应用程序中看到.

可以通过向上或向下拖动曲线上的点来改变视频的回放速率.视频也可以保存在此状态.

我正在寻找一种动态加速/缩小视频的方法,以便在播放视频时可以更改播放速率.

视频说明

在此输入图像描述

我做了什么

  • .的播放rate属性.AVPlayer但它仅适用于播放速率的几个值(0.50,0.67,0.80,1.0,1.25,1.50和2.0),并且无法保存视频
  • scaleTimeRange(..)财产AVMutableComposition.但是,当你想不工作坡道的逐渐递减快/慢运动的视频.

  • 使用CAEAGLLayer和在屏幕上显示视频帧CADisplayLink.但是我试图用这种方法试图实现慢/快动作的尝试并没有成功.

这一切花了我几个月的时间,我开始怀疑我是否能够完成这一切.

因此,任何建议都是非常有价值的.

BHe*_*cks 1

所以我不确定我完全理解你想要的用例,但我认为

func setRate(_ rate: Float, 
      time itemTime: CMTime, 
      atHostTime hostClockTime: CMTime) 
Run Code Online (Sandbox Code Playgroud)

[苹果文档来源]

是您正在寻找的东西。虽然这可能不完全是您所需要的,但我也不确定文档中的哪里正是您正在寻找的内容,但仅使用上述方法,您可以执行以下操作以可变速率保存视频:

  1. 使用上述方法以每秒所需的速率播放整个视频(假设它不太长,否则在某些设备上这在计算上是不可能的/值得超时)。设计 UI 来调整每秒速率。

  2. 在引擎盖下,您实际上可以以该速度“逐帧”播放视频并捕获您想要的帧(在右侧的#中,这将为您提供您想要的速率),瞧——将正确数量的帧保存在一起(跳过/根据需要进行复制以根据“选择器”用户界面增加/降低所需的速率)您现在已经完成了您想要的

需要明确的是,我在这里讨论的是 60FPS 的视频输出,每秒有 60 帧。您可以根据从用户那里收到的任何 UI 步进器值(在问题包含的屏幕截图示例中,作为我的基础),从字面上将源视频中的帧“剪切并粘贴”到“目标”视频中,然后选择那么多帧。又名,如果用户说 20 秒视频的第 2-10 秒应该为 2X,则只为每一秒(如果以 60 FPS 拍摄)交替帧放入 30 帧。在 60 FPS 下,输出看起来像是 2 倍速度(因为原始视频现在每 1 秒有 30 帧,在 60 FPS 下为 0.5 秒)。同样,任何值都可以适当地分解为:

  • (所需一致的 FPS)=(源视频 FPS)=(目标视频 FPS)(即 60 或 90)
  • (速率)=(从 UI 步进器/图形 UI 到选择速率@每个时间间隔的速率)(即 1X/2x/0.25X)
  • (所需的一致 FPS)*(速率)=(目标视频中保留的帧数)
  • (目标视频帧)=(源视频)*(所需的一致 FPS)~调制方式~(每个自定义时间间隔速率)

^^ 的确切机制实际上可能内置于 AVPlayer 中,我没有找到详细信息,但这本身就应该是让您朝着这个方向前进的一个良好的开始。