-1

我在尝试使用内部 Flash 播放器完全缓冲来自 Wowza 媒体服务器的预先录制的 rtmp 流时遇到了一些麻烦。完全预缓冲视频的要求来自管理层。必须可以离线观看整个视频。

当 netConnection 对象获得连接时,我创建了 NetStream 对象,为其设置元数据事件处理程序,将 NetStream.maxBufferTime 设置为视频的完整持续时间。此外,在创建 NetStream 时,我向视频组件添加了一个 Event.ENTER_FRAME 侦听器,以便它检查视频何时加载(它有一个宽度),因此它将在第一帧暂停。

然后我开始播放来自 netstream 的视频。当接收到元数据事件时,缓冲区被设置,当第一帧被下载并显示在视频对象上时,播放器在第一帧上暂停,但继续将视频加载到缓冲区中。现在,当我跟踪缓冲区(NetStream.bufferLength)时,我注意到以下现象,这对我来说是一个主要的悲痛之源:

如果 NetStream.maxBufferTime 设置为视频长度的 100%,则视频被完全缓冲,大约四秒后播放头(NetStream.time)被移动到视频的末尾。但是,当我在 Linux 系统上恢复播放时,视频显示正常,但播放头保持在 100%(这对自定义提示点处理造成严重破坏)。在 Windows 系统上,播放头也保持在 100%,但视频以正常速度的 100 倍播放。

当缓冲区达到 100% 时,事件 NetStream.buffer.flush 和 NetStream.play.stop(?!?!) 被触发,但播放器对它们都没有反应,所以对我来说,这似乎是闪存中的一个错误NetStream 或 Wowza。

但是,如果我将 NetStream.maxBufferTime 设置为(视频长度 - 0.4),则缓冲在流结束之前停止,并且 NetStream.Play.stop 不会被触发并且播放头停留在第一帧,但这感觉有点太hackish的解决方案。

渐进式下载也不是一个解决方案,因为至少一些(如果不是全部)视频必须至少在一定程度上受到保护,以免被复制。

任何指针?

Wowza 是 2.something,flex 是 4.1 以支持 flash 10.1,流要么用 flex/flash 记录器记录,要么上传到服务器并转换为 h.264(两者都表现出这种行为。)flash 版本范围从 10.1到 11.0。

编辑:似乎我们将在这个问题上采取的最终路径是,任何需要保护的视频都将作为 rtmp 流提供,缓冲最少,公共视频将作为渐进式下载的服务器。正如评论中提到的那样,rtmp 不应该做缓冲,所以我们所做的基本上是错误的。供将来参考:不要缓冲超过几秒钟的 rtmp 流。

4

1 回答 1

1

我不太确定您的答案 - 但是,我的第一个问题肯定是,您为什么要尝试缓冲流式视频的整个长度?我不明白答案 - 只是想获得更多信息!

于 2011-10-14T21:27:51.920 回答