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

时间:2017-04-16 14:32:04

标签: ios video opengl-es avfoundation playback

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

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

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

Video explanation

enter image description here

我做了什么

  • rate的播放AVPlayer属性。但它仅适用于播放速率的几个值(0.50,0.67,0.80,1.0,1.25,1.50和2.0),并且无法保存视频
  • scaleTimeRange(..)的{​​{1}}属性。但是当您想要斜坡视频以逐渐减少慢/快动作时,它不起作用。

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

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

因此,任何建议都会非常有价值。

2 个答案:

答案 0 :(得分:1)

在IOS中,MPNowPlayingInfoCenter对象包含一个' nowPlayingInfo'其内容描述正在播放的项目的字典。建议您在“当前播放曲目”中开始播放。然后设置速度。在开发人员论坛上查看此thread

你最终可能会得到类似this(但这是javascript)的内容,其中视频的播放速度加快了4倍。



  document.querySelector('video').playbackRate = 4.0;
  document.querySelector('video').play();

video{width:400px;
   height:auto;}

<video controls preload="true" autoplay>
      <source src="http://www.rachelgallen.com/nature.mp4" type="video/mp4" > 
</video>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

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

func setRate(_ rate: Float, 
      time itemTime: CMTime, 
      atHostTime hostClockTime: CMTime) 

[Apple Documentation Source]

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

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

2)在引擎盖下你可以实际以“逐帧”的速度播放视频并捕捉你想要的帧(在右边#这将给你你想要的速率)和瞧 - 保存正确的数字框架在一起(根据需要跳过/复制以根据“选择器”UI增加/降低所需的速率)你现在已经完成了你想要的东西

要清楚,我在这里谈论的是视频输出@ 60FPS每秒60帧。根据您从用户那里收到的任何UI步进器值,您可以将源视频中的帧“剪切并粘贴”到“目标”视频中(在截取的示例中,问题包含,作为我的基础),然后选择很多帧。 AKA如果用户说他们的20秒视频的秒数2-10应该是2X,那么这些秒的每一秒(如果以60 FPS拍摄)交替帧只能放置30帧。输出将在60FPS时看起来像2倍速(因为现在每1秒原始视频有30帧,在60 FPS时为0.5秒)。同样,任何价值都可以适当考虑在内:

  • (所需的一致FPS)=(源视频FPS)=(目标视频FPS)(即60或90)
  • (费率)=(从每个时间间隔的UI步进/图表用户界面到采摘率的比率)(即1X / 2x / 0.25X)
  • (所需的一致FPS)*(费率)=(目标视频中保留的#帧数)
  • (目标视频帧)=(源视频)*(所需的一致FPS)〜由〜(每自定义时间间隔率)调制

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