8

我正在使用 NetStream.appendBytes() 在Adob​​e 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

4

7 回答 7

1

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

于 2011-08-11T02:18:40.857 回答
0

I know this question is really old... but it is still a problem that I just faced and I know others will too... So I wanted to post the link to the other Stack question where I posted the bug at Adobe and the workaround to get it to work.

Workaround for bug on a duplicate Stack Question

于 2015-03-26T16:33:53.557 回答
0

尝试将 Video 对象放在 MovieClip 中并使用bit.draw(_movieclipInstanceName);而不是 video 对象。我希望它有效。

于 2012-03-13T16:21:37.957 回答
0

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

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

好吧,解决方案是播放一个假的视频 url,比如“<code>netstream.play(http://myserv.com/video.flv)”,上面有一个真正的跨域文件,之后,你只需要借助 appendBytes 功能加载您想要的视频。

SWF被愚弄了!

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

于 2011-06-01T14:07:41.923 回答
0

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

像这样:

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

checkPolicyFile标志的作用是告诉主机 swf 从加载的 swf 的服务器加载策略文件。如果您在加载时没有指定该标志,SecurityError当您尝试通过BitmapData.draw().

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

于 2011-04-09T18:52:08.287 回答
0

除非名为 StreamVideoSampleAccess 或 StreamAudioSampleAccess 的服务器端设置设置为 true 或设置为类似 StreamVideoSampleAccess/StramVideoSampleAccess,否则您无法从 rtmp 流中获取视频或音频的快照。如果无法访问 FMS 服务器端,我还没有找到一种方法。

于 2011-08-05T18:33:55.467 回答
-1

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

可能的解决方法:等到 NetStream.Buffer.Full NetStatus 被调度后再调用 draw()

于 2012-05-23T21:30:35.627 回答