【问题标题】:How to dynamically change the playback rate of video in iOS?如何在 iOS 中动态改变视频的播放速率?
【发布时间】:2017-04-16 14:32:04
【问题描述】:

可以在Flow ● Slow and Fast Motion 应用程序中看到我正在努力实现的完美示例。

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

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

Video explanation

我的尝试

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

  • 使用CAEAGLLayerCADisplayLink 在屏幕上显示视频帧。但是我试图用这个实现慢/快动作的许多尝试都没有成功。

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

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

【问题讨论】:

    标签: ios video opengl-es avfoundation playback


    【解决方案1】:

    在 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>

    【讨论】:

    • 感谢您的回答,一旦我在 AVFoundation 中找不到任何有用的东西,我将尝试使用 MediaPlayer 框架,因为我仍然认为 easing 慢动作 问题可以用它来解决。
    • jsfiddle.net/RachGal/nL9zoezm 减慢版,播放速率低于 0.5 似乎没有声音(或者我可能只是听的时间不够长..)
    • 虽然playackRate的大范围整数值可以在JavaScript中使用,我不知道有没有办法用playbackRate导出视频。
    • developer.apple.com/library/content/documentation/AudioVideo/… 参考 Create a CMTimeRange (第 16 个 'time' 使用 Find.. 实例,以及如何导出所述媒体时间范围(页面末尾)
    【解决方案2】:

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

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

    [Apple Documentation Source]

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

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

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

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

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

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

    【讨论】:

    • 很好的答案。我不太确定setRate(..) 属性的工作原理,但一旦有一个工作示例,我就会回来。与此同时,我一直在尝试探索其他方法,并为播放器构建 UI。谢谢你的回复,你太棒了!
    • 是的,老实说,我什至不确定您是否需要 setRate,具体取决于视频的类型。您可能可以使用 AVPlayer 来抓取单个帧,然后根据用户修改的每个时间块所需的最终速率对它们进行相应的整理。 @Tyrone 但是 AVPlayer 的苹果文档(在我的回答中的 setRate 文档中找到)应该也会引导您了解如何做到这一点。
    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2013-04-05
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多