我正在使用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
时不可用?
答案 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()
。
答案 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以及使其发挥作用的解决方法。
答案 6 :(得分:-1)
看起来您正在尝试对未加载的视频或NetStream对象为空时调用BitmapData.draw()方法。
可能的修复:等到NetStream.Buffer.Full NetStatus被调度后再调用draw()