1

我一直在寻找,找不到解决方案。我有一个在 OSMF 上播放的 25 FPS 视频,但 OSMF 坚持以 29-31 FPS 播放。这会导致视频播放速度比实时快约 15%。如果您在 VLC 中打开相同的视频并并排播放,结果会非常明显。

当我尝试进行直播时,问题就出现了。它会吃掉缓冲区并赶上实时,然后流崩溃,因为没有新的视频在等待。

我尝试跟踪代码以找出帧实际输出到屏幕的位置,但我在 SWC 文件中遇到了死胡同。我也尝试过在线搜索,但我找不到任何关于限制 FPS 的信息——每个人都只是对增加它感兴趣。

我宁愿以 15 FPS 的速度播放并每秒丢掉 10 帧,也不愿赶上实时并悲惨地崩溃。

编辑 -在花了整个周末盯着这个问题之后,我取得了一些令人难以置信的进展。首先,在 OSMF 中限制 FPS 的唯一方法是发送自定义 FLV 标头,并适当设置时间戳(1000 / FPS每帧之间的差异)

意识到这一点,我可以通过基于内部计数器手动设置时间戳来临时解决这个问题。每次处理一帧集timestamp = last_timestamp + 40;。问题是我不知道视频是否总是 25 FPS。有一天我可能会有 30 FPS 甚至 60 FPS 的视频流。为了使它更健壮,我决定解码 MPEG-2 标头(读取 PTS 值)并将其转换为 FLV 标头。

现在问题来了……这个视频文件(理论上是 25 FPS)在 QuickTime 中可以完美播放。结果,我知道标头很好,因为背后有数十亿美元的昂贵软件正确计算了帧速率。但是当我从标题中读取 PTS(根据这个 SO 帖子)并除以 90(将 90Khz 时钟转换为毫秒时间戳)时,每个时间戳相隔 33 或 34 毫秒 - 我得到的 29~31 FPS。

那么,当我知道视频是 25 FPS(相隔 40 毫秒)时,为什么 PTS 会给我相隔 33-34 毫秒的时间戳?更重要的是,QuickTime 是如何读取 MPEG-2 标头以便一切正常播放的?

4

2 回答 2

2

首先,回答我原来的问题:

降低 OSMF 中的 FPS

您必须创建自己的文件处理程序实现来解析视频头并修改时间戳。没有办法告诉 OSMF 播放“慢动作”或“快进”。有关创建自己的文件处理程序的示例,请查看FLVParser该类。请注意,有用于解析视频和音频标签的单独类。必须在其中的每一个中更新标头,以确保视频和音频同步播放。

当一个文件被传递给视频解析器时,每个时间戳都被认为是相对于第一个时间戳的。因此,如果第一个时间戳是 1234,那么这将被设置为“时间零”,并且所有未来的时间戳都将与此相关。这很重要。如果您跳过视频标签,并且您发送的第一个时间戳来自视频的后面,它将使用错误的“时间零”值,并且事情将无法正确同步。

这让我们……</p>

我的问题

首先,M3U8 中的持续时间与时间戳差异的总和不匹配。从第一个时间戳开始并将其标记为“时间零”,然后查看最后一个时间戳并从中减去时间零,得到的时间跨度不等于 TS 文件的预期持续时间。

事实证明,当 VLC 或 QuickTime 遇到这种情况(PTS 值的总和不等于视频的持续时间)时,它们会即时生成新的标头。取持续时间,除以帧数,PTS 值之间有新的偏移量。

那是我的第一个问题。一旦解决了这个问题,我就不再每 10 秒获得一秒,而是每 2 分钟获得一秒。原来我也加载下一个 TS 文件有点太早了(一个错误),这导致我从每个 TS 中丢弃一个数据包。这导致每 10 秒丢失一帧。

附加信息

此后不久,我遇到了另一个 FPS 问题,我找到了解决方案。任何遇到 OSMF 播放视频太快的人,我敦促您使用 grep 代码获取bufferTimeMax.

当 bufferTimeMax > 0 且 bufferLength >= bufferTimeMax 时,音频播放速度会更快,直到 bufferLength 达到 bufferTime。如果直播流是纯视频的,则视频播放速度会更快,直到 bufferLength 达到 bufferTime。

根据播放滞后的程度(bufferLength 和 bufferTime 之间的差异),Flash Player 将追赶率控制在 1.5% 和 6.25% 之间。如果流包含音频,则可以通过频域下采样来实现更快的播放,从而最大限度地减少可听失真。

6.25% = 每 15 秒 0.975 秒(每 10~20 秒增加一秒)

于 2014-01-15T19:23:28.923 回答
0

您需要手动设置 FPS。

在 Flash Professional 中,您可以在文档属性中更改帧速率。

在 Flash Builder 中,您可以使用元数据设置帧速率,如此此处所述。

因此...

[SWF(frameRate='15')]

于 2014-01-12T00:02:21.787 回答