在没有HTTP的AIR中加载图像和视频

时间:2012-01-02 18:42:25

标签: actionscript-3 air flash-cs5

我很好奇直接从文件系统加载图像和视频数据的正确方法是什么,而不使用HTTP。

我正在编写一个AIR幻灯片应用程序,它运行良好,但目前依赖于本地MAMP服务器通过标准的,经过验证的真实FLASH媒体加载方法将所有媒体交给应用程序。

我知道,因为FLASH是作为一个网络插件开发的,所以它最好地处理这种接收数据的方式,但我真的很想解开这个相当繁重和不必要的东西并将应用​​程序作为一个独立的播放器,但是,我不清楚加载媒体的“正确”方法是什么。

我准备好了File对象,并且我已经让用户选择从中拉取媒体的本地目录,并且我从列表中获取文件列表(基于它们的扩展名)。 ..但现在是什么?

2 个答案:

答案 0 :(得分:3)

首先,您必须将文件内容放在ByteArray中(代码来自FileStream documentation

var bytes:ByteArray = new ByteArray();
var myFileStream:FileStream = new FileStream();
var myFile:File = File.documentsDirectory.resolvePath("test.jpg");

myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
myFileStream.openAsync(myFile, FileMode.READ);

function progressHandler(event:ProgressEvent):void 
{
    if (myFileStream.bytesAvailable)
    {
        myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable);
    }
    else
    {
        myFileStream.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
        loadImage();
    }
}

然后您可以在Loader中加载这些字节以显示图像(请参阅方法Loader.loadBytes

function loadImage():void
{
    var loader:Loader = new Loader();
    loader.loadBytes(bytes);    
    addChild(loader);
}

干杯

答案 1 :(得分:1)

使用此代码,Loader将触发Event.COMPLTE事件,您将能够从中操作Bitmap:

var bytes:ByteArray = new ByteArray();
var myFileStream:FileStream = new FileStream();
var myFile:File = File.documentsDirectory.resolvePath(YOUR_PATH);

myFileStream.addEventListener(Event.COMPLETE, fileCompleteHandler)
myFileStream.openAsync(myFile, FileMode.READ);

function fileCompleteHandler(event:Event):void 
{
    myFileStream.readBytes(bytes);

    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
    loader.loadBytes(bytes);

    function imageLoaded(e:Event):void
    {
        addChild(Bitmap(loader.content));
        myFileStream.removeEventListener(Event.COMPLETE, fileCompleteHandler);
        myFileStream.close();
    }
}

PS:感谢Kodiak,我根据你的代码制作了我的代码。