如何在NetStream.appendBytes中使用BitmapData.draw?

时间:2011-04-09 18:43:48

标签: flash actionscript-3 adobe air flash-video

我正在使用NetStream.appendBytes()在Adobe AIR中播放本地视频(不涉及服务器)。我想使用BitmapData.draw()来拍摄视频输出,但是我收到了这个错误:

  

错误#2123:安全沙箱冲突:BitmapData.draw:无法访问null。没有授予访问权限的策略文件。

以下是一些示例代码:

package
{
    import flash.display.Sprite;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.net.NetStreamAppendBytesAction;
    import flash.utils.ByteArray;
    import flash.display.BitmapData;

    class ByteArrayPlayer extends Sprite
    {
        private var _ns:NetStream;
        private var _nc:NetConnection;
        private var _video:Video;

        public function playVideo(path:String):void
        {
            _nc = new NetConnection();
            _nc.connect(null);
            _ns = new NetStream(_nc);

            _video = new Video();
            addChild(_video);
            _video.attachNetStream(_ns);

            _ns.play(null);
            _ns.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN);

            var file:File = new File(path);
            var fileStream:FileStream = new FileStream();
            fileStream.open(file, FileMode.READ);

            var bytes:ByteArray = new ByteArray();

            fileStream.readBytes(bytes);

            _ns.appendBytes(bytes);
        }


        public function getImage(video:Video):BitmapData
        {
            var bit:BitmapData = new BitmapData(_video.width, _video.height);
            bit.draw(_video);            //This will cause the error
            return bit;
        }
    }
}

这只是用于解释的示例代码。在视频播放时调用getImage方法时会发生错误。该错误提到未找到的策略文件。由于文件是在本地加载的,因此实际上没有放置策略文件的位置。是否有需要设置的政策设置,或BitmapData.draw功能在使用appendBytes时不可用?

7 个答案:

答案 0 :(得分:1)

我认为另一种解决方案是使用_ns.play(path)而不是使用_ns.appendBytes()

答案 1 :(得分:0)

在调用NetStream.checkPolicyFile = true函数之前尝试设置play()

像这样:

_ns.checkPolicyFile = true;
_ns.play(null);

checkPolicyFile标志的作用是告诉主机swf从加载的swf服务器加载策略文件。如果您在加载时未指定该标记,则当您尝试通过SecurityError从加载的流中获取像素数据时,您将收到BitmapData.draw()

链接到Adobe资源:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#checkPolicyFile

答案 2 :(得分:0)

尝试绘制netstream.appendByte()内容时,我有一个摆脱沙盒错误的解决方案。

SWF检索沙箱,因为他正在您:netstream.play(null)指定的地址处查找跨域文件。他正在寻找一些不存在的东西。

嗯,解决方法是播放一个虚假的视频网址,例如“netstream.play(http://myserv.com/video.flv)”,上面有一个真正的跨域文件,之后,由于appendBytes功能,您只需要加载所需的视频。

SWF被骗了!

听起来很奇怪,它对我有用:-)

答案 3 :(得分:0)

除非将名为StreamVideoSampleAccess或StreamAudioSampleAccess的服务器端设置设置为true或设置为此StreamVideoSampleAccess / StramVideoSampleAccess,否则无法从rtmp流中获取视频或音频的快照。如果没有访问FMS服务器端,我还没有发现这样做的方法。

答案 4 :(得分:0)

尝试将Video对象放入MovieClip并使用bit.draw(_movieclipInstanceName);代替视频对象。我希望它有效。

答案 5 :(得分:0)

我知道这个问题真的很老......但是我刚刚遇到的问题仍然存在,我知道其他人也会这样...所以我想把链接发布到我发布错误的其他Stack问题Adobe以及使其发挥作用的解决方法。

Workaround for bug on a duplicate Stack Question

答案 6 :(得分:-1)

看起来您正在尝试对未加载的视频或NetStream对象为空时调用BitmapData.draw()方法。

可能的修复:等到NetStream.Buffer.Full NetStatus被调度后再调用draw()