[flex] 如何将一系列连续的图片播放成视频
qhyou
2013-12-09
我有一系列从视频中截取出来的连续帧而生成的JPG图片,文件很小255x144的。由于某些原因,我只能把视频截为连续的图,然后通过flash player播放成视频。
由于图片不是固定的,而是动态变化的,因此我用Socket将文件以二进制的形式发送给SWF客户端,然后在SWF中链接Socket Server,拿到图片后,再利用Timer定时以每隔50ms的速度将这些二进制的数据快速load出来,文件确实可以连续播放,但图片播放的速度特别慢。 经过分析,TCP传输文件速度特别快,因此带宽不是问题,问题在于这些小图片连续播放的时候,就像慢动作一样,帧率达不到人眼看起来连续的效果。有没有高手给出一些建议呢? |
|
x87343133
2013-12-10
把你关键代码贴上来,取到数据然后播放那部分的
|
|
qhyou
2013-12-10
接收数据并渲染数据的代码如下:
// Class constructor public function DisplayAssetLoader () { trace("sandbox type:" + Security.sandboxType); // Now, create the Loader object that will generate // the asset from the loaded bytes loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.INIT, assetInitListener); timer = new Timer(50,0); timer.addEventListener(TimerEvent.TIMER, timerEvent); // Create the status TextField statusField = new TextField(); statusField.border = true; statusField.background = true; statusField.width = statusField.height = 350; statusField.x=300; statusField.y=0; addChild(statusField); // Create the socket object socket = new Socket(); // Register for socket events socket.addEventListener(Event.CONNECT, connectListener); socket.addEventListener(Event.CLOSE, closeListener); socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataListener); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorListener); // Tell the user we're about to try connecting to the socket out("Attempting connection..."); timer.start(); // Attempt to connect to the socket try { socket.connect("localhost", 7777); } catch (e:Error) { out("Connection problem!\n"); out(e.message); } } protected function timerEvent(event:TimerEvent):void { if (buffer.length<1) return; renderImg(); event.updateAfterEvent(); } private function renderImg():void { // get a file's length buffer.position = curPos ; var fileLen:int = buffer.readUnsignedByte(); fileLen = (fileLen*256 )+ buffer[curPos+1]; //if data is a complete file if(buffer.length < (fileLen +2)*fileNo) return ; var bytes:ByteArray = new ByteArray(); buffer.position = curPos+2;//omit two prefix byte buffer.readBytes(bytes ,0 ,fileLen); // Generate an asset from the loaded bytes loader.loadBytes(bytes); //point to the next file curPos += fileLen + 2; fileNo++; out("========= rendered the file "+fileNo+" OK, len="+fileLen); } |
|
qhyou
2013-12-11
x87343133 写道 把你关键代码贴上来,取到数据然后播放那部分的 代码已经贴出来,请赐教啊。
|
|
samm
2013-12-11
1S需要24张以上就成动画了。50MS一次慢了。
|
|
qhyou
2013-12-12
samm 写道 1S需要24张以上就成动画了。50MS一次慢了。
把时间缩短也不行,主要原因是每张图片render时间太长,我用offscreen二次缓存还是不行。。 |