现在很多在线视频网站都支持在线视频,基本上都是基于FLV来实现的,这个话题并不是一篇叙述怎么去开发FLV播放系统的,而是告诉大家怎么样去解决一些常遇到的问题:
首先问题就是文件的上传和截图:估计这是最多人关心也是最头疼的,上传估计不是问题,其实主要问题就是截图。到Google上去搜索,截图实现的方法基本上是利用ffmpeg来实现,这个方案很合理,但是对大众来说不实用,相信很多人都是用虚拟服务器的,那么服务器端的配置是不能自主制定的,那就更别说什么安装ffmpeg来实现FLV截图,包括这个网站也遇到这样的情况。但是庆幸的是如果你是用Flash来开发你的上传程序,那么,你是可以解决这些问题的,原理很简单,首先我们上传文件,然后用客户端的Flash读取,利用BitmapData类的Draw()方法来截取图片,然后把截取取的图片进行PNG编码,再上传到服务器,服务器接受后写成文件(当然是要安全验证后)。如果你运气好的话,利用AMFPHP作为数据接受端,因为其支持byteArray类型,所以可以直接写PNG图形文件,如果是普通PHP的话,其实也不难利用
$image=file_get_contents('php://input');
就能把所有PUSH过来的ByteArray接收到变量里面来了。
然而现在第二个问题出现了,因为用的是虚拟服务器,规模和服务器的容量都是有限的,而且FLV文件又是那么的占用空间,如果视频一多,肯定空间回吃紧,这样不就很容易造成空间不够用的问题吗?
的确,这个问题也是十分棘手的,大家的金钱有限啊,有没有办法来解决呢?我这里有一个权宜之计:因为现在很多FLV来源于网络,或者说储存在其他的网站上,为何我不借他人之东风呢?嘿嘿,这招阴招就是直接利用已经在网络上存在的资源来共享到自己网站上,对于HTML的网页来说,说这招就没有意思,因为像YouTube这样的视频共享网站上早就提供HTML共享代码,直接插入就好了,甚至图都可以截好,但是对像这个网站一样的纯Flash网站,这招可就有点困难了,主要问题就是再获取文件地址和截图方面:
文件地址其实很容易解决,利用FireFox的拓展DownloadHelper能很轻松地获取到FLV文件的原地址。
截图确实有点问题,大家都知道Flash的安全权限制约了很多操作,例如BitmapData的Draw函数就被制约住了:
The source object and (in the case of a Sprite or MovieClip object) all of its child objects do not come from the same domain as the caller, or are not in a SWF file that is accessible to the caller by having called the Security.allowDomain() method.
//引自Flex2的帮助文档
上面说了,如果Draw的对象不是在同域内,必须调用Security.allowDomain()读取安全沙箱的文件才能执行该操作。傻眼了吧,别人的网站怎么可能专门为你再目录里写一个这样的文件呢?但是,解决方法一样还是存在的,我称之为骇客技术(Hack),这个骇客技术也是我在研究了《 Action Script 3.0 Cookbook 》中对Video类的论述才想到的:
When you close a NetStream object, it doesn't automatically clear the video display. The last frame of the video remains visible in the Video object until you either remove the Video object or call the clear( ) method. The following example clears a Video object by calling the clear( ) method.
video.clear( );
//来源于 Action Script 3.0 Cookbook
即使你关闭了NetStream,它并不会自动清楚现实的视频画面,而是停留再最后的显示画面。
呵呵,聪明的朋友应该想到了,利用这个方法,我们可以通过假装读取一个不存在的文件,来骗过Flash的安全机制,假设我们现在要开始对Video截图了:
var returnBitmapData:BitmapData=new BitmapData(120,90);
videoStream.play("proxy.flv");
//实际上proxy.flv是不存在的
videoStream.pause();
returnBitmapData.draw(video_viewer);
好了现在的问题解决了。
上面只是对FLV开发上传开发的一个小小的提示,当然你可能在开发上遇见更多问题,我也很希望你也能在这里分享,这也是为什么这里设计成不需要注册就能让游客发布话题的原因。希望大家能通过这篇文章受到一点启发。
loading...