我一直在寻找,找不到解决方案。我有一个在 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 标头以便一切正常播放的?