1

我遇到了一些奇怪的行为,我找不到任何记录在案的知识。

这是正在发生的事情:

调用 play() 方法后,当 NetStatus 代码为“NetStream.Play.Start”时暂停网络流。这将禁用自动播放的默认行为。在使用togglePause() 或 resume() 恢复之前,请执行搜索操作。当您尝试使用 togglePause() 或 resume() 恢复时,网络流将不会再次开始播放。

如果您只是立即 pause() 然后 resume() 而中间没有 seek() ,它恢复正常。

此外,如果您将初始暂停延迟大约 250 毫秒,那么您可以在 seek() 和随后的 resume() 之后没有问题。

我在这里发布了一个演示和来源:http: //drinkspiler.cannonballinteractive.com/temp/ResumeAfterPauseAndSeek/

该代码是直接来自 NetStream 的 AS3 文档的示例代码,并添加了一些小的附加功能来处理初始暂停以及处理查找和恢复按钮。没什么大不了的。

请注意,我通过调用 stream.seek(0) 然后 stream.pause(); 来暂停。这可确保第一帧显示在 Video 实例中,而不是什么都不显示。没有 stream.seek(0) 并且仅使用 stream.pause() 停止播放时会发生相同的行为。

我也尝试过延迟调用 startPaused(); 直到缓冲区满事件代码但行为是相同的。

谁能帮我找到一个合理的解决方法或为我确认这是一个错误?非常感谢!

4

2 回答 2

3

肯定有一些错误在起作用(以及一些糟糕的文档)。但是,我认为您的样本存在两个潜在问题:

  1. 我认为在接收有关 FLV 的元数据之前调用 NetStream.seek 不是一个好主意。(考虑从元数据中提取持续时间)。我不知道是否有关于此的官方文档,但我从经验中发现它可能会出现问题。您可以尝试将任何暂停/搜索事件放在 onMetaData 事件处理程序中。

    我有限的理解是元数据包含在 FLV 数据中。它可以在任何地方,但理想情况下,通常情况下,它位于文件的前面。因此,当逐步下载时,NetStream 必须接收到足够的信息来获取它需要的元数据,以便对视频进行更高级的操作(如搜索)。这可以解释为什么在暂停 250 毫秒时它对你有用。

  2. 您的示例 FLV 的编码方式与我使用过的其他 FLV 不同。我不完全确定为什么,但是如果我更改为引用不同的 FLV,一切都很好(在问题 #1 得到解决之后。)

    我想也许您的示例 FLV 只是缺少关键帧,这是寻找所需的。我尝试重新编码以包含关键帧,但它仍然无法正常工作。我不太确定该 FLV 有什么不同,如果有人能指出这一点,我会发现它也非常有用。

关于使用 seek(0) 调用来确保有一个海报框架......我自己不必这样做。这也可能与 FLV 的编码方式有关。

于 2009-08-27T22:29:40.497 回答
1

如果你做一个 netstream.seek(0); 它再次调用您的元数据处理程序。

于 2011-08-17T16:56:00.427 回答