DirectShow 编辑服务中的时间

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

[此 API 不受支持,将来可能会更改或不可用。]

若要编辑视频,必须使用一些重要的计时概念。 例如:

  • 每个剪辑都有一个持续时间。
  • 剪辑、切换和效果在特定时间显示在项目中。
  • 视频具有帧速率,以每秒帧数 (fps) 表示。

DirectShow Editing Services (DES) 提供各种设置或检索时间和帧速率的方法。 这些值的含义取决于上下文。

时间值

当参数表示某个时间时,可能具有三种不同的含义:

  • 时间线时间:相对于时间线开始的时间。 例如,剪辑可能从 2 秒开始进入时间线,或者切换 15 秒进入时间线。 时间线确定最终呈现的项目,因此还可以将时间线时间视为“项目时间”。
  • 媒体时间:源文件中相对于文件开头的点,在正常播放期间达到。 例如,如果你有一个 10 秒的视频文件,则文件中途的点在 5 秒处出现,表示为媒体时间。
  • 父时间:相对于时间线中的对象的时间。 例如,如果对象在时间线上从 8 秒开始,并且包含另一个从时间线 10 秒开始的对象,则子对象相对于父对象从 2 秒开始。 相对于时间线,虚拟跟踪都从时间零开始。 因此,对于虚拟轨道中的任何对象,父时间等于时间线时间。

媒体时间仅适用于源对象。 每个源对象都有一个媒体启动时间和一个媒体停止时间。 例如,假设你有一个 10 秒的视频剪辑,并且你希望仅使用距剪辑中间 5 秒的时间,剪裁该剪辑的前 2 秒和最后 3 秒。 如果希望剪辑在项目中显示 20 秒, (并假设播放速率) 则指定以下开始和停止时间。

  • 媒体启动:2 秒

  • 媒体停止:7 秒

  • 时间线开始时间:20 秒

  • 时间线停止时间:25 秒

    在时间线上插入源剪辑

帧速率

帧速率是媒体流的“速度”,以每秒帧数为单位。 与时间值一样,帧速率的含义取决于上下文:

  • 输出帧速率: 最终呈现项目的帧速率,由组定义。 呈现项目时,每个组将成为具有其自己的帧速率的单独媒体流。
  • 源帧速率: 最初创作源文件的帧速率。 创作的帧速率不必与组的输出帧速率匹配。 DES 将根据需要自动对文件进行升采样或降级采样。 对于大多数媒体格式,DES 可以通过检查格式来确定帧速率。 DIB 序列是一个例外;必须指定 DIB 序列的帧速率。 (有关详细信息,请参阅 使用 Sources.)

播放速率: 源剪辑出现在项目中时的明显速度。 例如,10 秒的视频可以在时间线上容纳 5 秒。 因此,剪辑的速度增加了 2,如下图所示。

加快源播放速度

(使用音频源时,音调也会移动。) 以下公式确定源剪辑的播放速率:

  • 播放速率 = (媒体停止 – 媒体启动) / (时间线停止 – 时间线开始)

请注意,这三个速率中的每一个都独立于其他速率:

  • 可以通过调整媒体时间来加快或减慢剪辑速度;这不会影响最终输出的帧速率。
  • 可以在不影响文件播放速度的情况下增加或降低输出帧速率。
  • 可以在同一组中混合具有不同创作帧速率的源文件,DES 将向上采样或减少每个剪辑,以匹配组的帧速率。

呈现项目时,所有时间都舍入到最近的帧边界,由组帧速率确定。 例如,假设视频组的帧速率为 30 fps。 每帧大约为 33 毫秒 (毫秒) 。 假设将 1.68 秒的源剪辑添加到时间线,从时间零开始。 源不会完全在帧边界上结束,因此 DES 将停止时间舍入为 1.6666 秒 (50 帧) 。 如果在呈现的项目中查找到 1.68 秒,则实际上将查找到源末尾的第 51 帧。

但是,DES 不会覆盖源的停止时间。 稍后可以更改组帧速率,或将源移动到时间线中以不同方式舍入的新位置。 因此,DES 保留原始停止时间,并且仅在必要时进行舍入。 有关详细信息,请参阅 IAMTimelineObj::FixTimes

使用 DirectShow 编辑服务入门