如何编码一个流的RGBA值视频



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

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


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

我有一些Actionscript代码,在显示树上绘制和动画,我把它包装在一个AIR应用程序中,逐帧绘制BitmapData。事实证明,AIR在直接编码这个输出时效率非常低——我所管理的最好的是每秒几帧,我需要渲染至少15帧/秒,最好更像100帧/秒,当我输入PNG图像时,我从ffmpeg中得到这个值(AIR编码一个640x480的PNG需要1秒以上的时间……可怕的)。我可以将原始字节数据发送到编码器或磁盘,而不是在AIR中编码。

如果你想知道为什么我使用Actionscript渲染动画或为什么它必须快速编码,不要。可以这么说,帧是在执行时计算的(例如,不是作为动画存储在.swf文件中),我有大量的视频要创建,而且时间有限,使用Actionscript以外的东西来生成帧不是一个选择。

我想到的解决方案是使用x264代替ffmpeg。

出于测试目的,我将帧保存为文件:00.bin, 01.bin,…n.bin,包含640x480x4 ARGB像素值。我用来验证这种方法是否可行的命令是下面这个可怕的hack:

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代码片段是一个交换四字节端序的hack,因为x265只能接受BGRA,而我的测试文件包含ARGB。

简而言之,

  1. Actionscript将ARGB值呈现到ByteArray
  2. 将端位交换为BGRA
  3. 管道到x264: raw demuxer, bgra colorspace,指定fps/w/h/quality
  4. ? ?
  5. 利润。

相关内容

  • 没有找到相关文章

最新更新