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

如何在iOS中动态更改视频播放速率?,ios,video,opengl-es,avfoundation,playback,Ios,Video,Opengl Es,Avfoundation,Playback,我正在努力实现的完美例子可以在应用程序中看到 可以通过向上或向下拖动曲线上的点来更改视频的播放速率。在此状态下,视频也可以保存 我正在寻找一种动态加速/减速视频的方法,以便在播放视频时可以更改播放速率 我尝试过的 AVPlayer的playbackrate属性。但它仅适用于少数播放速率值(0.50、0.67、0.80、1.0、1.25、1.50和2.0),无法保存视频 AVMutableComposition的scaleTimeRange(..)属性。但是,当您希望渐变视频以逐渐减少慢/快

我正在努力实现的完美例子可以在应用程序中看到

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

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

我尝试过的

  • AVPlayer
    的playback
    rate
    属性。但它仅适用于少数播放速率值(0.50、0.67、0.80、1.0、1.25、1.50和2.0),无法保存视频
  • AVMutableComposition的
    scaleTimeRange(..)
    属性。但是,当您希望渐变视频以逐渐减少慢/快运动时,它不起作用

  • 使用
    CaeAglayer
    CADisplayLink
    在屏幕上显示视频帧。但是,我多次尝试用它来实现慢/快动作,但都没有成功

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


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

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

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

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

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

2) 在引擎盖下,你可以“一帧一帧”地播放视频,并捕获你想要的帧(在右边#这将为你提供你想要的速率),然后瞧——一起保存正确的帧数(根据需要跳过/复制以根据“picker”用户界面增加/降低所需速率)你现在已经完成了你想要的

要明确的是,我这里说的是一个视频输出@60FPS每秒60帧。您可以根据从用户处收到的任何UI steppers值(在截图示例中,问题所包含的作为我的基础),将源视频中的帧“剪切并粘贴”到“目标”视频中,并拾取那么多帧。也就是说,如果用户说他们20秒视频中的2-10秒应该是2倍,那么每秒钟只能放30帧(如果以60帧/秒的速度拍摄)交替帧。输出速度为60帧/秒,似乎是2倍(因为现在每1秒原始视频有30帧,60帧/秒时为0.5秒)。类似地,任何值都可以适当地分解为:

  • (期望的一致FPS)=(源视频FPS)=(目标视频FPS)(即60或90)
  • (速率)=(从UI步进器/图形UI到拾取速率的速率@每个时间间隔)(即1X/2x/0.25X)
  • (期望的一致FPS)*(速率)=(保存在目标视频中的帧)
  • (目标视频帧)=(源视频)*(期望的一致FPS)~由(每自定义时间间隔速率)调制

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

在IOS中,
mpNowPlayingFoCenter
对象包含一个“nowPlayingInfo”字典,其内容描述正在播放的项目。建议您以“当前播放速率”开始播放,然后设置速度。在开发者论坛上看到这个

您可能会得到类似这样的结果(但这是javascript),视频的播放速度提高了4

document.querySelector(“视频”).playbackRate=4.0;
document.querySelector('video').play()
video{宽度:400px;
高度:自动;}


回答得很好。我不太确定
设置率(…)
属性是否有效,但我会在有一个工作示例后尽快回来。与此同时,我一直在尝试探索其他方法来实现这一点,并为玩家构建UI。谢谢你的回复,你太棒了!是的,老实说,我甚至不确定你是否需要设置速率,这取决于视频的类型。您可能可以使用AVPlayer抓取单个帧,然后根据用户每次修改块时所需的最终速率对它们进行相应的整理@Tyrone但是苹果关于AVPlayer的文档(在我的回答中的
setRate
docs中找到)应该也会引导你如何做到这一点。谢谢你的回答,一旦我在
AVFoundation
中找不到任何有用的东西,我将尝试使用
MediaPlayer
框架,因为我仍然认为它可以解决缓解慢动作问题。速度较慢的版本,在0.5播放速率下似乎没有声音(或者可能我只是听的时间不够长。)虽然JavaScript中可以使用
playackRate
的大范围整数值,但我不知道是否有办法导出具有
playbackRate
的视频。请参阅使用Find..创建CMTimeRange(第16个“time”实例),以及如何导出所述媒体时间范围(页面末尾)