Flex VideoDisplay停止缓冲

时间:2009-01-20 16:49:50

标签: flash video flex h.264

我正在尝试使用Adobe Flex和libh264streaming构建视频播放器应用程序。在小盒子里我的小球员工作得很好。

然而,如果视频大约200-300MB,我会看到一堆问题:

  1. 浏览器崩溃。
  2. 它永远不会停止缓冲,一直下载直到它获得整个视频(300M)。
  3. CPU使用率上升以至于浏览器内存消耗。
  4. 我猜1.和1.是由于播放器需要越来越多的内存来存储视频。

    我希望以某种方式限制缓冲区大小,并在达到上限后立即停止下载视频。我认为YouTube视频播放器就是这样(看着播放器底部的播放器控件)。

    如何在Flex中实现它?

4 个答案:

答案 0 :(得分:1)

究竟什么是“libh264streaming”?在Google上搜索它只显示具有该确切文本的此主题。根据你的描述,听起来它根本不是流式传输视频,只是提供渐进式下载。

渐进式下载有时被错误地称为流式传输。它只是文件的正常HTTP下载,只要视频标题位于文件的开头,Flash就会在标题加上一定的最小视频数据后立即开始播放文件(4个关键帧我相信)。渐进式下载传统上不提供带宽限制或流式传输的其他优势,但最近有些提供了下载缓慢的实现,这种实现更接近流式传输并且可以在文件中间开始渐进式下载(动态重写头部)以允许人们跳转到中间没有下载整个东西。

Flash Player仅支持RTMP进行流式传输。这是Flash Media Server支持的专有协议和一些开源选项,如Red5,rubyizumi。 Adobe仅在两天前宣布它将发布并提供RTMP的开放许可,因此您应该会在不久的将来看到更多支持RTMP的产品。 Streaming提供与客户端和服务器的双向通信,因此服务器发送请求数量的帧作为缓冲区,客户端请求帧以根据需要填充缓冲区。服务器发送的数量不超过请求的数量,服务器可以只使用需要刷新的缓冲区而不是整个视频来搜索各个点。

如果要提供大文件,可能需要一个真正的流媒体服务器。另一种方法是将文件分解成块,根据需要下载并一个接一个地播放。那也很复杂,但可行。

HTH,

萨姆


我们正在招聘!华盛顿特区(或寻求重新安置)的开发人员和QA应将简历发送至careers@blinemedical.com。


答案 1 :(得分:1)

我能够在2个VideoDisplay对象的基础上创建一个组件,以块的形式加载mp4文件(比如每个缓冲区1分钟)。只要主显示器达到某个点(在我的情况下为缓冲区大小的50%),辅助VideoDisplay就开始加载视频。主视频完成后,组件将立即翻转到辅助显示屏。

使用mod_h264_streaming,这种方法非常有效。寻求操作几乎立即工作。

答案 2 :(得分:0)

我猜测没有人回答这个问题的部分原因是因为没有很好的答案。我当然不是Flash流媒体的专家,但是为了发布至少一些回复你的东西,我猜测,通过阅读文档并亲自尝试一些事情,你正在尝试的是什么使用VideoDisplay对象并且完全在Flex环境中无法完成;它可能需要在服务器上处理,或者至少在服务器和客户端之间处理,以便流正确地传递和终止,VideoDisplay对象只是正常运行。

对不起,我希望我有更好的答案。如果有其他人在那里,请随时加入。

答案 3 :(得分:0)

很难确定,但看起来你提到的lib提供了一些控制机制来告诉服务器你想要播放哪个块(我从他们网页上的声明中得到这个:......“你有很长的视频剪辑,你不想把它们重新编码成更小的部分?我们也支持'虚拟视频剪辑',所以你可以指定只播放部分视频或创建下载链接到特定部分视频。“

对我而言,您似乎只需添加一个控制结构,允许您(告诉服务器)以块的形式获取视频。

如果由于某种原因无法做到这一点,并且您只能访问原始数据流:

我需要知道你在flex中使用哪些接口加载视频,但一般情况下,你会添加一个接收ProgressEvent的监听器并检查加载的字节数(对于通用加载器对象)

你的另一个选择是使用读写方法创建自己的套接字,你可以用它来检查你的字节计数器是否有数据。你可以将字节读取放入bytearray,然后当你有一个可用的块时,您需要将该字节数组转换为适合播放器对象的格式...

看看flash.net.Socket

http://livedocs.adobe.com/flex/2/langref/flash/net/Socket.html