Actionscript 3 从使用Nestream AppendBytes(AS3)解码的视频中获取位图?

Actionscript 3 从使用Nestream AppendBytes(AS3)解码的视频中获取位图?,actionscript-3,video,video-processing,netstream,Actionscript 3,Video,Video Processing,Netstream,我想知道在Flash中处理过NetStream.appendBytes的人是否知道如何从解码视频帧中获取bitmapData?我已经看过了,但那是3年前的事了,最近的评论/回答似乎已经不见了2014年是否有人成功地将这些字节转换成位图?我正在使用Flash Player 11.8,这不是一个桌面/空中应用程序 在下图中,我可以执行步骤1)和2),但在步骤3) 问题是简单地使用bitmapdata.draw(视频容器)不起作用,但它会抛出策略文件错误,即使我使用的是byteArray(来自与SW

我想知道在Flash中处理过
NetStream.appendBytes
的人是否知道如何从解码视频帧中获取
bitmapData
?我已经看过了,但那是3年前的事了,最近的评论/回答似乎已经不见了2014年是否有人成功地将这些字节转换成位图?我正在使用Flash Player 11.8,这不是一个桌面/空中应用程序

在下图中,我可以执行步骤1)2),但在步骤3)

问题是简单地使用
bitmapdata.draw(视频容器)不起作用,但它会抛出策略文件错误,即使我使用的是
byteArray
(来自与SWF位于同一目录中的本地视频文件)。甚至没有涉及互联网,但Flash告诉我,
“没有从服务器授予权限的策略文件”
或诸如此类的废话。我认为这个错误只是一种纾困,而不是直截了当地说“你不允许这样做……”

我已经尝试过:试图平息这个
Crossdomain.xml
问题,并查看所有已知的安全/域设置。我得出的结论是错误不是问题,而是问题的副作用。。这里的问题是:
Flash Player
知道SWF的位置和它本地的任何文件。当您将
字符串
作为URL等传递时,这没关系,但是当
Netstream
数据不是SWF域的本地数据时,它就变成了策略文件问题。问题是我的数据在内存中,而不是像SWF那样的文件夹中,因此无法使用alllow
bitmapData。draw
因为它无法“监控”字节数组,任何已知的修复方法?。。。(我甚至说不出我真正想说的话)


我试图实现的目标:基本上是使用Netstream作为H.263或H.264图像解码器,方法与
加载程序
是JPEG到位图的解码器或
加载压缩的解码器相同。
是MP3到PCM的解码器。你知道,访问原材料(这里是RGB像素),应用一些特效功能,然后发送到屏幕或保存到磁盘

要从视频流中拍摄快照,我们不需要将数据注入
NetStream
对象的
NetStream.appendBytes

为此,我们可以使用具有一些安全约束的。这就是为什么很多时候我们都会出现闪存安全错误。关于这一点,Adobe表示:

"... Flash Player 9.0.115.0及更高版本和Adobe AIR中的RTMP支持此方法。您可以通过服务器端脚本控制对Flash Media Server上的流的访问。有关更多信息,请参阅Adobe Flash Media Server服务器端ActionScript语言参考中的Client.audioSampleAccess和Client.videoSampleAccess属性。如果源对象和(在Sprite或MovieClip对象的情况下)其所有子对象与调用者不来自同一个域,或者不在调用者通过调用Security.allowDomain()方法可以访问的内容中,则调用draw()会引发SecurityError异常。此限制不适用于应用程序安全沙箱中的空气内容。。。“

对于AMS服务器的跨域文件创建和其他一些安全配置,您可以查看以下帖子:

在允许脚本从视频流中获取数据后,我们可以传递到代码

我编写了一段代码,用于播放视频流(rtmp或http),并拍摄快照以在后台显示,或在应用以下命令后将其保存为文件:

const服务器:String=null;/'rtmp://localhost/vod'
const stream:String='stream';/'mp4:big_buck_bunny_480p_h264.mp4';
var-nc:NetConnection;
var-ns:NetStream;
视频:视频;
常量jpg_质量:int=80;
常数px_大小:int=10;
nc=新的网络连接();
addEventListener(AsyncErrorEvent.ASYNC_ERROR,函数(e:AsyncErrorEvent):void{});
nc.addEventListener(NetStatusEvent.NET_状态,函数(e:NetStatusEvent):void{
如果(e.info.code=='NetConnection.Connect.Success'){
ns=新的NetStream(nc);
addEventListener(NetStatusEvent.NET_状态,函数(e:NetStatusEvent):void{});
addEventListener(AsyncErrorEvent.ASYNC_ERROR,函数(e:AsyncErrorEvent):void{});
视频=新视频(320、180);
video.x=video.y=10;
视频.附件流(ns);
addChild(视频);
ns.播放(流);
}
})
nc.connect(服务器);
btn_show.addEventListener(
MouseEvent.CLICK,
函数(e:MouseEvent):void{
var bmp:Bitmap=像素(视频,像素大小);
bmp.x=10;
bmp.y=220;
addChild(bmp);
}
)
btn_save.addEventListener(
MouseEvent.CLICK,
函数(e:MouseEvent):void{
var bmp:Bitmap=像素(视频,像素大小);
var jpg_编码器:JPGEncoder=新的JPGEncoder(80);
var jpg_stream:ByteArray=jpg_encoder.encode(bmp.bitmapData);
var file:FileReference=newfilereference();
保存(jpg_stream,'snapshot_'+int(ns.time)+'.jpg');
}
)
函数像素(目标:DisplayObject,像素大小:uint):位图{
变量i:uint,j:uint=0;
变量s:uint=px_大小;
变量d:DisplayObject=target;
变量w:uint=d.宽度;
var h:uint=d.高度;
var bmd_src:BitmapData=新的BitmapData(w,h);
bmd_src.图纸(d);
var bmd_final:BitmapData=新的BitmapData(w,h);
var rec:Rectangle=新矩形();
rec.width=rec.height=s;
对于(i=0;i
当然,这只是一个简单的例子来说明
const server:String = null; //'rtmp://localhost/vod'
const stream:String = 'stream'; // 'mp4:big_buck_bunny_480p_h264.mp4';
var nc:NetConnection;
var ns:NetStream;
var video:Video;
const jpg_quality:int = 80;
const px_size:int = 10;

nc = new NetConnection();
nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, function(e:AsyncErrorEvent):void{});
nc.addEventListener(NetStatusEvent.NET_STATUS, function(e:NetStatusEvent):void{
    if(e.info.code == 'NetConnection.Connect.Success'){
        ns = new NetStream(nc);
        ns.addEventListener(NetStatusEvent.NET_STATUS, function(e:NetStatusEvent):void{});
        ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, function(e:AsyncErrorEvent):void{});
        video = new Video(320, 180);
        video.x = video.y = 10;
        video.attachNetStream(ns);
        addChild(video);
        ns.play(stream);
    }
})
nc.connect(server);

btn_show.addEventListener(
    MouseEvent.CLICK,
    function(e:MouseEvent): void{
        var bmp:Bitmap = pixelate(video, px_size);
            bmp.x = 10;
            bmp.y = 220;
        addChild(bmp);
    }
)
btn_save.addEventListener(
    MouseEvent.CLICK,
    function(e:MouseEvent): void{

        var bmp:Bitmap = pixelate(video, px_size);

        var jpg_encoder:JPGEncoder = new JPGEncoder(80);
        var jpg_stream:ByteArray = jpg_encoder.encode(bmp.bitmapData);

        var file:FileReference = new FileReference();
            file.save(jpg_stream, 'snapshot_'+int(ns.time)+'.jpg');

    }
)

function pixelate(target:DisplayObject, px_size:uint):Bitmap {

    var i:uint, j:uint = 0;
    var s:uint = px_size;
    var d:DisplayObject = target;

    var w:uint = d.width;
    var h:uint = d.height;

    var bmd_src:BitmapData = new BitmapData(w, h);
        bmd_src.draw(d);

    var bmd_final:BitmapData = new BitmapData(w, h);

    var rec:Rectangle = new Rectangle();
        rec.width = rec.height = s;

    for (i = 0; i < w; i += s){
        for (j = 0; j < h; j += s){
            rec.x = i;
            rec.y = j;                  
            bmd_final.fillRect(rec, bmd_src.getPixel32(i, j));
        }
    }

    bmd_src.dispose();
    bmd_src = null;

    return new Bitmap(bmd_final);
}
// ...

net_stream.play(null);

net_stream.play('');

// ...