[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二次缓存还是不行。。
Global site tag (gtag.js) - Google Analytics