[AS3]AS3.0中netstream的一些问题解决方法
文章的由来:当用seek()擦洗视频的时候,发现每当跳转到flv视频接近结尾的时候的时候(flv视频用的外部载入的方式,而不是流媒体的方 式),大概相差几帧到几十帧的样子,就会接受到NetStream.Seek.InvalidTime,然后奇怪的事情发生了,视频不会再往下播放了,而 是卡在了这帧视频。百思不得其解下上网查找,通过看了一老外的博客,才发现NetStream原来大有文章。
问题的产生原因:开始想到是flv视频的元数据(通过onMetaData取得)里有一个canSeekToEnd(一个布尔值,如果 FLV 文件是用最后一帧(它允许定位到渐进式下载
影片剪辑的末尾)上的关键帧编码的,则该值为 true。如果 FLV 文件不是用最后一帧上的关键帧编码的,则该值为 false。),难道是它作怪?赶紧打印之,发现此只是true。排除这个可能。最后看到一老外的博文(http://www.brooksandrus.com/blog/2008/11/05/3-years-later-netstream-still-sucks/),才知道NetStream坑了多少兄弟(还学了英文,知道了suck有烂的意思~)。下面就仔细分析下。
1.大家都知道,外部载入的视频不能精确seek(),当你seek到T时,它会寻找离T最近的关键帧,从这个关键帧开始继续播放。但是不是每一帧 都是关键帧,也就是说不是每一帧都可以seek()到的。所以当seek(T)的这个T已经越过了最后一个可以跳转的帧(其实是时间点,因为 NetStream使用time属性来代表播放位置的),就会发生本文开始时的悲剧。所以当我们跳到快到结尾的时候,应该seek()到最后的可跳转帧, 这样才不会出问题。
2.那又有人要问了,我怎么知道最后一个可跳转帧在哪里。别急,当你跳到不该跳的地方会收到NetStream.Seek.InvalidTime,所以这样写:
- if (e.info.code == "NetStream.Seek.InvalidTime") {
- _stm.seek(e.info.details);
- }
这个e.info.details就是用户可以搜寻的最后一个有效位置。
3.还有一个最坑爹的问题,当seek()成功之后,你会发现NetStream.time属性还是seek前得值,这是怎么回事呢?没错,这个 time的值竟然不是及时刷新的,够坑爹吧?那么怎么才能得到它刷新的值呢?在上面说道的老外的博客里有说明,以后有时间我也会在整理下,好了,时间到 了,下班(再次鄙视下NetStream)。
热门文章推荐
- [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示例