4月 142017
 

rtmp延时低,但是累计延时就不一定低。随着播放时间的久远以及网络状况的变化。rtmp延时会比较严重,甚至达到几十秒的延时。这个时候,直播的体验会很差很差。这就是rtmp的一个缺点。rtmp是基于tcp,不会丢包。所以当网络状态差时,服务器会将包缓存起来。待网络状况好了,就一起发给客户端。

对于NetStream,有一个属性叫bufferTimeMax。指定实时流内容的最大缓冲区长度(以秒为单位)。默认值为 0。由于网络和设备问题(如发送方和接收方之间存在时钟偏移),缓冲区长度可随时间不断增加。设置此属性可使实时应用(如会议和监视)的缓冲区长度最大化。当 bufferTimeMax > 0,并且 bufferLength >= bufferTimeMax 时,将加快音频的播放速度,直到 bufferLength 达到 bufferTime。如果实时流仅包含视频,则视频播放较快,直到 bufferLength 达到 bufferTime。Flash Player 将捕捉速率控制在 1.5% 和 6.25% 之间,具体取决于播放延迟量(bufferLength 和 bufferTime 差异)。如果流中包含音频,通过缩减频率域采样,使音频失真最小化,可以加快播放。设置 bufferTimeMax 属性可在以下情况下启用实时缓冲流追赶:
1,以数据流的方式从 Flash Media Server 传输实时介质。
2,以数据流的方式在数据生成模式 (NetStream.appendBytes()) 下传输实时介质。

本来以为只要设置下bufferTimeMax就可以了。使用方式(上边两点)限制了bufferTimeMax的作用。

那么,遇到问题,总要解决问题的。可以手动加一个定时器,间隔可以根据需要来做。每个这个间隔,就去检查bufferLentgh的大小。bufferLength的值越大,表示离真实的实时时间越远。实时性约差。当bufferLength的大小超过了预期的值,就对NetStream做pause和resume处理。用来释放数据。来达到及时同步的目的。当然,你也可以初始化重连,但这样容易引起黑屏。

这个方法,也是迫于无奈。公司项目用推流工具推流,客户端通过rtmp连接观看。两者之间,没加入其他的沟通环节。不知道客户端此时的流与真实流的状况。

4月 072017
 

用h5播放或flash播放mp4文件时,有时候遇到播放有声音没画面。但是用本地播放器(VLC media player,mediaplayer等)播放时,视频音频都有。这个时候,就涉及到h5和flash能支持播放的格式以及编码格式了。

mp4只是视频容器(文件格式)。至于里边的视频,音频用什么编码,又是另外一说。常见的mp4封装的视频编码有H.264,也就是AVC,是MPEG-4的part10编码。还有一种是 MPEG-4 Visual,它是MPEG-4的part2编码。对于视频编码,flash和h5只支持H.264编码的。其他编码的都是播不出来的。

编码格式以及flash支持播放的格式。可以看下边的连接。

http://www.c-ps.net/trade/content/2009/6/11553.html

http://zengrong.net/post/393.htm

https://www.zhihu.com/question/20997688
Continue reading »

3月 212017
 

通常,flash是被嵌入到网页中。而网页如何嵌入到flash中呢。flash没有对应处理显示web页面的api(air有),所以只是表象:网页和swf是一体的,两者相互融洽,看得似好。利用iframe,通过层级关系,将网页和flash的宽高,坐标对应好就可以了。
这个时候,还会出现一个问题。如果flash的坐标改变了,iframe的相对坐标也应改变。为了处理好这种因变化而变化的关系,特意抽象了一个类,用来实现这种现象和变化。注释,原理都写在类中了。看了就会明白吧。

先看个demo:
http://www.vinixiu.com/demo/as3/swfiframe.html

再贴类:
Continue reading »

1月 122017
 

http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

AS3常用的http请求方式也是post和get。当对URLRequest对象设置method方式为get或post以外的方式,就会报错。
ArgumentError: Error #2008: 参数 method 必须是某个可接受的值。

Continue reading »

 Posted by at 下午4:39  Tagged with:
5月 112016
 

        最近,在处理一些音频事情。遇到这样一个问题,播放全频广播语音,flash播放服务端编码的flv视频数据(可以只有音频),发现播放比较慢。播放速度是正常速度的一半左右。随着时间的累计,NetStream的bufferLength越来越长。开始以为封装成flv的时候,采样率设置错误。经过多次修改测试,发现并不是这样。后来观察下行流量,发现下行流量是正常情况下的两倍左右。于是,去检查socket过来的数据,发现每次相同的数据发了两份。于是,稍微修改下,丢掉相同的另一份数据。音频播放就正常了。此刻,可以想到。NetStream播放速度变慢,是每次appendBytes了两份同样的数据。

2月 232016
 

大部分时候,我们会放弃系统的默认镶边,自定义自己想要的镶边。这个时候,就需要自己手动来写效果了。基本过程是这样的。
1,屏蔽系统的镶边。
2,自己写皮肤,写逻辑(拖拽窗体,resize窗体,最大化,最小化,关闭,恢复等)。
每个AIR都有一个默认的xml配置文件,这里边定义了一些参数。通过打开注释,改变下边两个参数来关闭系统的镶边。一个是关闭镶边,另一个是打开透明。

        <!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
        <systemChrome>none</systemChrome>

        <!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. -->
        <transparent>true</transparent>

通过以上的设置,关闭了系统的镶边显示。然后来看怎么写自定义的镶边。最大化,最小化这些,比较好处理。这里主要讲下自由拖拽和自由resize。air提供了一个很好的方法(nativeWindow.startResize),来启动窗体的自由resize。里边可以带参数。参数标明拖拽的八个方向。仅仅这个是不够的,还要定义鼠标效果。鼠标移上去,拖拽光标要显示出来,拖拽的时候,光标跟着走。这里细节还是比较多。先记下光标的实现。
1,自己定义光标的显示对象。(位图,自己绘制都行)。
2,通过Mouse.registerCursor注册光标。registerCursor方法有两个参数,第一个参数是光标的名字,后边调用的时候需要,第二个参数是一个BitmapData的数组。就是光标的显示。
3,通过调用Mouse.cursor方法来更换光标。
其实,到了这里。在做这些之前,系统就已经有了一些光标效果。如鼠标遇到输入的时候的输入光标,遇到按钮的时候手型光标。当然通过上边的步骤,可以实现光标的定义。

下边说下拖拽。八个方向(上,上左,上右,左,右,下,下左,下右),通过定义sprite和范围来启动。可以通过定义一个sprite,然后通过Rectange来区分,调用resize,也可以通过建立八个sprite,分配好坐标来resize。我自己用的是后边一种方法。感觉还行。
建立八个sprite,然后对八个sprite进行侦听MouseDown,RollOver,RollOut事件。MouseDown事件,用来启动拖拽的,RollOver来显示光标的,RollOut来恢复到默认光标的。
RollOver的时候,根据不同的Sprite,取不同的光标效果。然后按下的时候,关掉mouseChildren属性。要不拖拽的时候,会出现泄露等瑕疵。同时,侦听stage的mouseUp事件,这个用来恢复默认光标。仅仅RllOut是不够的。还有,在RollOut的时候,如果鼠标状态是mouseDown状态,应不恢复默认光标。

上边这些可以定义到一个父类里边,以后用的时候,直接继承过来。至于按钮这些,可以定义在子类中。还有如果窗体是不规则的,可以自由对待。好了,细节有一些。贴出完整的代码吧。还需要更完善一些。
Continue reading »

2月 162016
 

TweenMax除了有基础的运动,loader等功能外,还有一些特殊的功能。比如滤镜的缓动,中心旋转,投影的缓动,变色的缓动等。

这些用到了其插件。这些插件在plugins包下。特意提出来,使用方法也有点不一样。使用插件效果分两步。

1,使用TweenPlugin的静态activate方法激活相应的插件。

TweenPlugin.activate([GlowFilterPlugin , TransformAroundCenterPlugin]);

2,用TweenLite启用插件,设置插件参数。

createScale();
curRotation = int(720 * Math.random());
TweenLite.to(image , 1.5 , {glowFilter:{color:int(0xffffff * Math.random()), blurX:10, blurY:10, strength:1, alpha:1} ,
                transformAroundCenter:{scale:curScale, rotation:curRotation}});

注意:用这个需要去下载greensock。免费插件会相对少一些功能。可以网上找全的。

Continue reading »

网站地图