0

我的任务是为 iPad 制作视频捕获和播放解决方案,它不会受益于持续的互联网连接。我们希望它是跨平台的,而且我对 Flex 非常了解,所以我尝试在 ActionScript 中实现这一点。我尝试了两种主要的解决方法。

我可以将相机附加到 flex 中的 Video 对象,然后开始捕获帧。我必须将每一帧存储到本地内存(因为没有互联网),然后再上传。我需要确保视频对于上传和内存管理问题来说不是很大。我的第一次尝试是以大约 30 的 FPS 间隔截取当前帧的屏幕截图。然后缩小帧并将其保存到本地存储。那行得通,我的视频很小。但是,当我构建一个播放器并播放视频(将帧缩放回全屏)时,视频是如此像素化,看起来像是一个失真的 8 位视频。那是行不通的。我像这样缩放和捕获:

        video.clear();          
        offScreenBMP.lock();            
        offScreenBMP.fillRect(fillRect, 0x000000);
        offScreenBMP.draw(video, matrix, null, null, null, true);           
        offScreenBMP.unlock();

接下来,我尝试拍摄视频帧的全屏图像,然后将 n - 1 帧与 n 帧进行像素更改比较,并仅保存更改像素的向量。它们太多了,我还不如只保存完整尺寸图像的完整 ByteArray,因为我会用完内存,我的上传会很糟糕,UI 性能是不可接受的。

else {          
            var  pixelVect:Vector.<Pixel> = new Vector.<Pixel>();
            //the number of x pixels
            var cols:int = lastScreenBMP.width;
            //the number of y pixels
            var rows:int = lastScreenBMP.height;
            for(var i:int = 0; i < cols; i++) {
                for(var j:int = 0; j < rows; j++) {
                    if(lastScreenBMP.getPixel(i, j) != offScreenBMP.getPixel(i, j)) {
                        var p:Pixel = new Pixel();
                        p.pixelX = i;
                        p.pixelY = j;
                        p.pixel = offScreenBMP.getPixel(i, j);
                        pixelVect.push(p);
                    }
                }
            }
            recordLocation.setProperty("gtvideo" + imageSaving, pixelVect);
            lastScreenBMP.copyPixels(offScreenBMP, new Rectangle(0, 0, offScreenBMP.width, offScreenBMP.height), 
                new Point(0, 0));
        }

不幸的是,Flex 没有很好的方法来捕捉视频,而且我的任何尝试都不可接受。但是,如果可以的话,我想坚持下去并建立自己的。如果我为 iOS 制定一个解决方案,我也必须为 Android 这样做,然后谁知道将来会做什么。如果我可以使用 Flex 完成此任务,我将受益于一个适用于所有平台(甚至桌面)的解决方案。有没有人遇到过类似的问题和/或您对如何克服这个问题有任何想法?

4

0 回答 0