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

7tofc5zh  于 2023-01-22  发布在  iOS
关注(0)|答案(2)|浏览(244)

Flow ● Slow and Fast Motion应用程序就是我想要实现的完美例子。
用户可以通过向上或向下拖动曲线上的点来更改视频的播放速率。在此状态下,也可以保存视频。
我正在寻找一种动态加快/减慢视频速度的方法,以便在播放视频的同时可以更改播放速率。
Video explanation

"我所尝试的“

  • AVPlayer的playback rate属性。但它仅适用于播放速率的几个值(0.50、0.67、0.80、1.0、1.25、1.50和2.0),并且无法保存视频
  • AVMutableCompositionscaleTimeRange(..)属性。但当您想要渐变视频以逐渐减少慢/快动作时,它不起作用。
    *使用CAEAGLLayerCADisplayLink在屏幕上显示视频帧。但是我多次尝试用这个来实现慢/快动作都没有成功。

这一切花了我几个月的时间,我开始怀疑我是否能完成这一切。
因此,任何建议都是非常有价值的。

iovurdzv

iovurdzv1#

在IOS中,MPNowPlayingInfoCenter对象包含一个"nowPlayingInfo"字典,其内容描述了正在播放的项目。建议您以"currentplaybackrate"开始播放,然后设置速度。请在开发者论坛上查看此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>
2hh7jdfx

2hh7jdfx2#

所以我不确定我是否完全理解了您要使用的情形,但我认为

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

Apple Documentation Source(https://developer.apple.com/documentation/avfoundation/avplayer/1386591-setrate)
虽然这可能不是你所需要的,我也不知道在文档中的什么地方有你所需要的,但是仅仅使用上面的方法,你就可以做以下事情来以可变的速率保存视频:
1.使用上述方法以所需的每秒速率播放视频(假设视频不太长,否则在某些设备上计算不可能/值得超时)。设计UI以调整此每秒速率。
1.在引擎盖下,您实际上可以以该速度“逐帧”播放视频并捕获您想要的帧(在右侧#中,这将为您提供您想要的速率),瞧-将正确数量的帧保存在一起(根据需要跳过/复制,以基于“选择器”UI增加/降低所需速率),您现在已经完成了您想要的
需要说明的是,我在这里讨论的是每秒60帧的视频输出@60FPS。您可以根据从用户那里接收到的UI步进器值,从源视频中将帧“剪切并粘贴”到“目标”视频中(在截图的例子中,问题包含,作为我的基础),并选择那么多帧。又名如果用户说他们20秒视频的第2-10秒应该是2倍,每秒钟只放30帧(如果是以60帧/秒拍摄的)交替帧。在60帧/秒下,输出看起来像是2倍的速度(因为现在原始视频每秒有30帧,而在60帧/秒下是0.5秒)。类似地,任何值都可以适当地分解为:

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

^^的确切机制实际上可能内置在AVPlayer中,我没有找到细节,但这应该是一个很好的开始,让你朝着这个方向前进。

相关问题