[AS3]as3播放器判断视频缓冲状态是否完成(seek触发事件)
flash视频中netStream.seek(timePoint) 会播放这个流的 timePoint 这个时间点的视频,但如果timePoint这个时间点为缓冲好的话,视频会停住不动,
并且seek不到的时候,不管是NetStream.Pause.Notify事件还是NetStream.Seek.InvalidTime事件都不会触发(NetStream.Seek.InvalidTime只有seek的时间超出全部视频完整时间的范围时才会触发),请问各位 seek一个未缓冲好的时间点到底会触发什么事件或检测到什么错误,我们怎么才能在程序中知道自己 现在seek的是一个为缓冲好的时间点?
例1:
- //CuPlayer.com定义一个Time 检测缓冲比
- var buffer_percent:Number=stream.bufferLength/stream.bufferTime;
- if (int(buffer_percent)==1) {
- Time.stop();
- trace('CuPlayer.com提示:可以播放')
- } else {
- trace('CuPlayer.com提示:还在缓冲')
- }
seek到了也会抛出 NetStream.Seek.Notify ,
这个事件没法用的。
stream.bufferLength/stream.bufferTime 只能检测出当前缓冲区还差多少百分比才能播放,与seek到seek不到没啥关系。
有没更好的办法啊?
Math.floor(int(duration) * stream.bytesLoaded / stream.bytesTotal)
//duration 总时间 * 加载的百分比,如果想用户每次拖动都回到能看的位置就 - 5 到10 秒 应该可以行。我做过测试!不知道是不是你想要的效果.
粗略计算就是这样
- /**
- * 设置播放的位置
- * @param value 播放的时间位置 毫秒
- *
- */
- public function set position(value:Number):void {
- if (value == int(duration)) {
- stream.seek(0);
- } else {
- if(value>Math.floor(int(duration) * stream.bytesLoaded / stream.bytesTotal))
- {
- stream.seek(Math.floor(int(duration) * stream.bytesLoaded / stream.bytesTotal)-5);
- }else{
- stream.seek(value);
- }
- }
- trace(value,int(duration));
- _bufferTime.start();
- }
通过查找视频里面的关键帧数组,没有的话,就用下载量的百分比做吧。不过一般都会有的。
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例