测试中偶然发现的

做个改进

本日志由 jk 于 2013-04-26 11:32:52 发表到 flash技术 中,目前已经被浏览 20 次,评论 1 次;


检索 COM 类工厂中 CLSID 为 {E5FF9F62-0E7C-4372-8AD5-DA7D2418070C} 的组件时失败,原因是出现以下错误: 80070005”。

很明显是组件没有被正确注册。

将jmail.dll拷贝到服务器的system32目录下 ,开始-运行-cmd-输入regsvr32 jmail.dll搞定。

本日志由 jk 于 2013-02-28 10:57:19 发表到 其他 中,目前已经被浏览 71 次,评论 0 次;

转一篇老外的博客,原文地址:http://www.flashmonkey.co.uk/how-to-make-displayobject3d-alpha-work-in-papervision/ 

How to make DisplayObject3D alpha work in Papervision

7 COMMENTS8 JULY 2009


I was recently playing around with Papervision and wanted to create a cube that faded in and out. A pretty simple thing to do, I was even using a Tween engine so it was just a few lines of code. However, the cube would just not fade! After a quick search on Google I found a useful post that quickly explain how to fix this. Basically you need to set the DO3D so it uses it’s own container like this:

DisplayObject3D.useOwnContainer = true;

Simple! But why is this? Being an inquisitive person I wanted to know exactly what was the reason for this and after a quick search into the code I found out why.

Basically, as I’m sure most people are aware, everything you render in Papervision is drawn to a Viewport3D, which extends Sprite and can be added to the display list. In order for you to have an alpha on an individual DisplayObject3D (or anything that extends it like a Sphere or a Cube) you need to give that object it’s own ViewportLayer and then the alpha can be applied to that. This is also useful for putting filters on objects in PaperVision.

Whilst doing this bit of snooping around I thought that a much nicer way of doing this would be to make the alpha variable a private member of the DisplayObject3D class, then create a getter/setter for it. Within the setter we can check to see if useOwnContainer is set to true, if it isn’t, we can do so thus removing the need for the code snippet above. I’ve amended the DisplayObject3D class slightly to incorporate this and you can download it here. Just replace the current DisplayObject3D.as in org/papervision3d/objects and away you go.

I’ve also added getters/setters for filters and blendMode which work in the same way.

I hope the above helps people and I really recommend doing your own snooping about in the PaperVision code to get a better understanding of how it all works as this will really help you to work with it.

UPDATE July 8, 2009, 18:33:
Since writing this post I have spoke to Chris O’Byrne about it and he raised some interested points that maybe I overlooked. His main point was that in a way my “fix” obfuscates how Papervision works and that it’s perhaps better to make developers set useOwnContainer themselves so they gather a better understanding of what they are actually doing. I think Chris may have a good point to be honest, although maybe an alert/warning to make beginners with Papervision aware would be a good compromise.

本日志由 jk 于 2013-01-25 11:17:31 发表到 flash技术 中,目前已经被浏览 218 次,评论 0 次;

作者添加了以下标签: pv3dalpha

本日志由 jk 于 2012-12-28 18:10:21 发表到 其他 中,目前已经被浏览 356 次,评论 0 次;

 今天线上调试时遇到这个奇怪的问题,这个问题可以确认在导出的发行版才出现,本地测试没有问题,线上才会出现。

查了查资料没发现一个合理的说法

http://baldscone.com/?p=574

解决办法:

找到出错的类,清理掉所有trace()信息,问题解决.

本日志由 Admin 于 2012-12-18 18:31:27 发表到 flash技术 中,目前已经被浏览 465 次,评论 0 次;

作者添加了以下标签: flashas3

     偶然间想起我还有这个科学院,可惜这地方已经长满了杂草,之前一直以为有大把时间会来这写点东西,也以为一直会记得这里,没想到一晃一年多,都没有触碰过,重新开荒吧。

     其实很多东西也都是这样,那些我们念念不忘的人,那些念念不忘的事,都在我们的念念不忘中慢慢的淡忘了……

本日志由 Admin 于 2012-12-09 09:26:07 发表到 其他 中,目前已经被浏览 492 次,评论 0 次;

 关于如何打造一个良好的网络播放器及播放体验

也是时候探讨一下如何打造一个良好的播放器产品和播放体验,虽然这个探讨比计划的早了些,视频网站一坨坨,播放体验也千差万别,但是这其中肯定有优秀的代表,以及他们的优秀在何处。

1、  基础部分的对比

2、  附加功能的对比与价值

3、  额外的一些细节

4、  关于技术的使用

5、  是否有标准?

6、  结论

主要样本:腾讯,搜狐,优酷,网易

打酱油样本:奇艺, YOUTUBE

 

一、  基础功能部分的对比(功能的延展性,交互,界面的差别)

基本功能:播放一个视频需要基本包含的部分

包括,播放、暂停、跳转、拖动、音量调节、全屏、普屏、缓冲时长、尺寸调节视频色彩调节

   基础功能的功能部分:几家播放器在概念和效果都完全一样,即点击暂停时影片会暂停,全屏时影片会全屏。完全符合用户预期的操作。

   但在在功能延展性上的有一些差别:

1、    全屏功能

        网易

延展性有差别,网易较差,设计的不够丰富。

但是可以理解,这种功能对高质量的长视频是很有帮助的,网易大部分是低码率的短视频,对用户体验影响不大

2、交互的差别

       

依次为搜狐腾讯优酷网易

鼠标滑过的体验

3、界面美观度的差别

横屏播放的比例,观察暂停按钮比例,网易按钮比例太小,质感略差,搜狐与腾讯做的最好,在质感与比例位置上,都做的不错

结论:我们基本可以看到腾讯、搜狐、优酷三家在基础功能部分的功能体验基本是一致的,而网易在界面和交互细节上做得不够友好,所以用户体验略差,这一块也是对使用者影响最大的一部分。

二、 附加功能的对比与价值

附加功能的存在也是为了更好的方便用户使用,如果附加功能是个鸡肋,相反会影响用户体验,比如播放器体积变大,加载变慢,bug不可控等等

 

分析例子

1、腾讯视频的附加功能最多,但是我在测试的功能的时候bug很多,gif截图从未成功过,这些附加功能的体验感觉并不好。

 

2、相反,搜狐的附加功能很少,但是确是很实用,不光为截图而截图,他的截图弥补了qq截图的不足,带有滤镜功效。为播放器加分不少。

 

 3、网易视频附加的看点功能也很好。

解决了大多数门户视频只能看不能说的需求,提高了用户参与度,又和其他一些满天飞字的极其猥琐的视频网站划清了界限。

结论:不主张在播放器上做太多附加的东西,播放器就是一个视频播放器,他的主要功能就是播放视频,在播放的体验上做得足够细致那就是一个良好的播放体验,不是photoshop 不是imageready,不需要承担过多的功能。否则牺牲的都是用户播放体验。

三、额外的一些细节

视频出错时的体验,我最欣赏youtube的效果。

 

一些细节上的细致(腾讯)

 

 

(搜狐)高光暗影,反射,外发光,在flash里绘这么多东西,还带动画,这个设计真是够闲。但是体验确实不错。

、关于技术的使用

技术的使用对用户体验影响也是很重要的一部分,这部分的影响主要体现在对加载过数据的使用。

2011年之前主流的视频网站都使用一般的http播放,这种播放都是直接加载CDN的资源,对加载数据的利用基本依靠浏览器对缓存文件的使用,这种利用率都很低。

但是随着flash10p2p的支持,短短一两年间视频p2p 技术也得到了大规模的应用。(这回再次感谢一下Adobe大神,又拯救了一个行业,(html5神马的弱爆了)使很多视频网站开始出现了盈利),flashp2p这两年还会再更多的领域发挥他的能量。

搜狐、优酷、奇艺都使用了p2p 的技术,但据我观察,腾讯这个土财主竟然没有使用p2p,真尼玛有钱。

视频p2p技术最大优势是节省了大量的带宽成本,第二个优势就是对加载过的数据的重新利用,因为这部分数据存在内存中,大小可以调节。所以p2p方式对缓存的利用率大大超过http方式,直接影响了用户观看的流畅性体验。

关于视频清晰度和视频格式

1、  腾讯全站都使用了mp4的封装格式,可能由于腾讯视频后来上的,所以采用都是统一的标准

2、  优酷方面全站掺杂了flv\mp4格式的视频,我觉得这也是可能由于新老编码系统存在的原因吧

3、  奇艺方面主要封装格式,应该是f4v格式,貌似没见过有其他的。

4、  网易的封装格式,也是两种flvmp4

各家视频走的编码格式都是H264编码格式,可能具体参数上会有差别,但是视频清晰度的对用户的影响应该体现片源内容的清晰度上。

、是否有统一标准?

网络视频播放器各家开发前后时间差距很大,但是功能基本一致,是否有某些参照标准,据我所知道的范围内,应该是没有成文的规定在这个领域,那么如此统一的理由有两个

1、  受传统桌面操作系统播放器设计的影响。功不可没的windows media player,培养了大批用户的播放器使用习惯。所以最早的视频网站优酷的播放器上隐隐约约都能看到window media player的身影

2、能保持这么一致和中国互联网业内勇于借鉴的传统是分不开的,后来几家的各个播放器都能保持如此统一,不可能不抄,找点证据吧,基本功能看不出端倪,附加功能看不出太多,不过我还是发现了,播放器右键菜单,做为使用率和关注度都不高的右键菜单,竟然也出奇的一致。

但是,也有例外…………

网易

事实再次证明,网易是有态度的,估计网易产品的梯子不够长,爬不出墙去。

说远了,既然标准就是参照已有的习惯。那么我们要稍微打破习惯结果会怎么样的?比如,或许我们可以尝试,播放按钮移到中间,just like this.

看起来也不差,这是一个思路。

说了这么多,总结一下。

美术与交互的对用户体验的影响最大,纯粹的照抄和模仿不会带来太好的效果,要结合自身产品的特点,加入交互和美术的方案,出一个有自己特色的播放器。

1、  在基本功能和交互上要与主流的用户习惯保持一致,特别在交互的细节上要多打磨,给用户一致的体验,细节上的差别用户能感受出来,但是,具体会说不上哪里不对劲。

2、  设计上要细腻,设计风格要突出自己的特点

3、  附加功能要适当,开发有利于增加用户播放体验的功能为主,太多附件功能会降低播放器性能,增大体积以及bug的不可控。

4、  技术上还是要用选用的主流技术,目前p2p是很不错的选择

5、或许可以在一些细节上创新。

来一个案例

只是简单改了界面和交互,但却是会提升不少(网易公开课)

 

JK-写于2012年12月07日.写了一下午也没什么稿费,转载时记得提起我……

本日志由 Admin 于 2012-12-07 17:17:37 发表到 flash技术 中,目前已经被浏览 450 次,评论 0 次;

作者添加了以下标签: flash播放器网络播放器用户体验

闲逛flex类包,突然发现XMLWatcher类,因为flex可以侦听xml变化,这个
能力已经郁闷我两三年了,于是就打开看了一下,最后分析到XMLNotifier
时找到了xml.notification()和xml.setNotification(func)的方法,
哈哈 原来xml有隐藏方法可以侦听change.于是赶紧测试一下,哇 果然
爽哇....

我个人正式时甚少使用xml做dataProvider对象,原因是
一:担心今后移植时xml不能派发事件而造成困难.
二:写成类可以方便调试.

现在的话,看来可以重新思考一下利用这个方法了,毕竟xml是一个比较
不错的树形链,能够清晰的观察里面的数据,这点比写成class要方便
些的..... 一切正在思考中.....

存在一个疑问,xml既然可以派发change事件,为什么不实现
IEventdispatcher? 是因为每个小node都要实现一个侦听器而造成
体积过大,还是这是内部临时方法,不保证未来修改,或其它什么原因?

有建议和想法的大大们请不吝指教啊...

多谢了.


下载地址 http://file.5uflash.com/wwxml.rar
再次感谢闪无忧提供上传空间.

 

  1. <p style="background:#ededed"> 
  2. package com.aaaqe.common.utils.xml  
  3. {  
  4.     import flash.events.Event;  
  5.     /**  
  6.      * xml变化的事件.   
  7.      * @author 汪汪  
  8.      *   
  9.      */      
  10.     public class XMLChangeEvent extends Event  
  11.     {  
  12.         /**  
  13.          * 事件名称统一为 XML_CHANGE.  
  14.          */          
  15.         public static const XML_CHANGE:String = "xmlChange";  
  16.         /**  
  17.          * 事件对象的kind,添加一个属性.   
  18.          */          
  19.         public static const ATTRIBUTE_ADDED:String = "attributeAdded";  
  20.         /**  
  21.          * 事件对象的kind,修改一个属性.   
  22.          */          
  23.         public static const ATTRIBUTE_CHANGED:String = "attributeChanged";  
  24.           
  25.         /**  
  26.          * 事件对象的kind,删除一个属性.   
  27.          */          
  28.         public static const ATTRIBUTE_REMOVED:String = "attributeRemoved";  
  29.         /**  
  30.          *  事件对象的kind,添加一个节点.   
  31.          */          
  32.         public static const NODE_ADDED:String = "nodeAdded";  
  33.         /**  
  34.          * 事件对象的kind,修改一个节点.   
  35.          */          
  36.         public static const NODE_CHANGED:String = "nodeChanged";  
  37.         /**  
  38.          * 事件对象的kind,删除一个节点.   
  39.          */          
  40.         public static const NODE_REMOVED:String = "nodeRemoved";  
  41.         /**  
  42.          * 事件对象的kind,添加一个节点,此方法后会再次派发 NODE_ADDED,当然是否有其它情况可能发生还不清楚.  
  43.          * 测试中xml.appendChild("text");,将会使用最后的节点名来创建一个新的节点.以后还需留意观察其它现象.  
  44.          */          
  45.         public static const TEXT_SET:String = "textSet";  
  46.         /**  
  47.          * 事件对象的kind,添加一个命名空间   
  48.          */          
  49.         public static const NAMESPACE_ADDED:String = "namespaceAdded";  
  50.         /**  
  51.          * 事件对象的kind,删除一个命名空间.   
  52.          */          
  53.         public static const NAMESPACE_REMOVED:String = "namespaceRemoved";  
  54.         /**  
  55.          * 如果是修改的话,这是修改前的值.   
  56.          */          
  57.         public var oldValue:Object;  
  58.         /**  
  59.          * 修改后的值或添加后的值.   
  60.          */          
  61.         public var newValue:Object;  
  62.         /**  
  63.          * 主xml.   
  64.          */          
  65.         public var currentXML:Object;  
  66.         /**  
  67.          * 当事者的xml.   
  68.          */          
  69.         public var xml:Object;  
  70.         /**  
  71.          * 属性名.   
  72.          */          
  73.         public var property:Object;  
  74.         /**  
  75.          * 事件类型.   
  76.          */          
  77.         public var kind:String;  
  78.         public function XMLChangeEvent(type:String, bubbles:Boolean=falsecancelable:Boolean=false)  
  79.         {  
  80.             super(type, bubbles, cancelable);  
  81.         }  
  82.         /**  
  83.          * @private   
  84.          * @return   
  85.          *   
  86.          */          
  87.         override public function toString() : String  
  88.         {  
  89.             return ("XMLChangeEvent\n"+getString("oldValue",oldValue)+getString("newValue",newValue)+getString("source",currentXML)  
  90.                 +getString("property",property)+"kind = " + kind);  
  91.         }  
  92.           
  93.         private static function getString(name:String,obj:Object):String  
  94.         {  
  95.             var str:String;  
  96.             str = name +" = \n\t" + (obj is XML? XML(obj).toXMLString():(obj ? obj.toString() :"null")) ;  
  97.             return str += "\n";  
  98.         }  
  99.         /**  
  100.          * @private   
  101.          * @return   
  102.          *   
  103.          */          
  104.         override public function clone() : Event  
  105.         {  
  106.             var evt:XMLChangeEvent;  
  107.             evt = new XMLChangeEvent(type,bubbles,cancelable);  
  108.             evt.oldValue = oldValue;  
  109.             evt.newValue = newValue;  
  110.             evt.currentXML = currentXML;  
  111.             evt.property = property;  
  112.             evt.kind = kind;  
  113.             return evt;  
  114.         }  
  115.     }  
  116. }  
  117. </p> 

本日志由 Admin 于 2010-09-01 08:17:59 发表到 flash技术 中,目前已经被浏览 392 次,评论 0 次;

作者添加了以下标签: flash xml节点

furnace repair homewood toronto garbage collection landscaping designer mesa, az eye doctor edmonton