在AS3中访问视频像素的最快方法是什么?

3
我希望能够高效地从一个位置复制1080p视频的像素到另一个位置,并且尽可能减少CPU的影响。目前我的实现相当简单:
- 使用BitmapData的draw()方法来获取视频中的像素 - 使用BitmapData的copyPixels()方法来移动像素
理想情况下,这应该尽可能减少CPU的影响,但是我已经没有更多的选择了,真的需要一些来自有经验的ActionScript 3开发者的技巧。
我使用Scout对我的代码进行了分析,发现CPU使用率大约在70%左右,但是经常超过100%。我研究了StageVideo,但主要限制之一是:
视频数据无法复制到BitmapData对象中(BitmapData.draw)。
是否有更直接的方法来访问视频像素,而不是将DisplayObject转换为位图? 我可以直接将每个视频帧作为ByteArray访问并插入到BitmapData对象中吗? (我发现appendBytes,但它似乎与我在设置中需要的相反)。 在ActionScript 3中,处理来自h264 1080p视频的像素最省CPU的方法是什么? 此外,是否有一种更快的方法来移动像素而不是使用Flash Player的copyPixels()?另外,我看到Scout指出视频没有进行硬件加速(.rend.video.hwrender:false)。根据this article,h264视频不应该进行硬件加速(即使没有stage video)吗?(或者这只适用于全屏模式)?

1
我认为使用多层抽象来操作这个大数据集不会比你已经拥有的更快,是的,copyPixels() 是其中最快的方法之一,也许你可以通过 getPixels()getVector() 获得稍微更快的速度,具体取决于你实际需要做什么。 - Vesper
感谢您清楚地解释了copyPixels()的信息。您是否知道直接从视频中获取像素的方法(而无需使用BitmapData'draw())? - George Profenza
不要尝试抓取字节。在解压缩后(即编写自己的自定义h.264解码器),才会出现像素。如果您使用appendBytes作为解码快捷方式,那么是的,字节将变成像素,但猜猜怎么着? BitmapData.draw()被Adobe阻止了!!在播放文件时可以绘制,通过byteArray提供的完全相同或任何自定义视频数据都会引发策略文件错误(什么鬼?尽管我能理解他们这样做的原因)。 - VC.One
你可以尝试将h.264转换为h.263(在FLV容器中),并嵌入到SWF中,然后可以加载它并逐帧绘制/效果。不要实时处理,而是将至少几秒钟的位图数据缓冲到某个字节数组中,然后进行追加。 - VC.One
@VC.One 感谢您提供的嵌入式编程想法,但我需要使用动态内容。自定义解码器选项听起来很有趣,也许可以通过炼金术/CrossBridge实现大部分在GPU上运行,但感觉有点过度设计。 - George Profenza
1个回答

2

最新的AIR beta版本引入了视频作为纹理支持,您可以可能使用它在GPU上处理视频(比使用BitmapData更快)。但请注意,目前仅适用于Windows上的AIR,并且还存在一些其他限制。


谢谢您的建议(+1),我之前不知道。不过我需要使用Flash Player运行时,而不是AIR,并尽可能支持更多的桌面系统。您是否知道类似于Flash Player的方法? - George Profenza
据我所知,除了使用BitmapData之外,没有其他有效的方法将帧上传到GPU。但我相信未来Flash Player会支持VideoTexture,因此在那之前,您应该坚持使用BitmapData方法。 - Varnius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接