如何将RGBA值流编码为视频?

时间:2011-08-29 20:27:16

标签: actionscript-3 stream ffmpeg bytearray video-encoding

更具体地说: 我有一系列32位无符号RGBA整数用于像素 - 例如从左侧像素开始每行640个整数,从顶行开始每帧480行,重复n帧。有没有一种简单的方法可以将它提供给ffmpeg(或其他编码器),而无需先将其编码为通用图像格式?

我假设ffmpeg是我在这种情况下使用的最佳工具,但我愿意接受建议(输出视频格式无关紧要)。


我知道如果我知道正确的关键字,文档会启发我......如果我问错了问题,这就是我在最高级别尝试做的事情:

我有一些在显示树上绘制和动画的Actionscript代码,我将它包装在一个逐帧绘制BitmapData的AIR应用程序中。 AIR已被证明在直接编码这个输出时效率很低 - 我所管理的最好的是每秒几帧,我需要渲染至少15 fps,最好更像100 fps,当我发现时,我从ffmpeg中得到了ffmpeg喂它PNG图像(AIR可能需要1秒多的时间来编码一个640x480 png ......令人震惊)。我可以将原始字节数据发送到编码器或磁盘,而不是在AIR内部进行编码。

如果您想知道为什么我使用Actionscript来渲染动画或为什么必须快速编码,请不要。可以这么说,帧是在执行时计算的(例如,没有存储为.swf文件中的动画),我有非常大量的视频要创建,并且有限的时间这样做,并使用除了生成框架的Actionscript不是一种选择。

1 个答案:

答案 0 :(得分:2)

我提出的解决方案是使用x264而不是ffmpeg。

出于测试目的,我将帧保存为文件:00.bin,01.bin,.. nn.bin,包含640x480x4 ARGB像素值。我用来验证方法可行的命令是以下可怕的黑客:

cat *.bin | \
perl -e 'while (sysread(STDIN,$d,4)){print pack("N",unpack("V",$d));}' | \
x264 --demuxer raw --input-csp bgra --fps 15 --input-res 640x480 --qp 0 \
     --muxer flv -o out.flv -

丑陋的perl片段中有一个黑客可以交换四字节字节顺序,因为x265只能接受BGRA而我的测试文件包含ARGB。

简而言之,

  1. Actionscript将ARGB值呈现为ByteArray
  2. 将endian交换为BGRA
  3. 将其传输到x264:raw demuxer,bgra colorspace,指定fps / w / h / quality
  4. 利润。