AIR - 将位图数据传输到FFmpeg视频

时间:2012-07-10 17:48:08

标签: actionscript-3 flash air stream ffmpeg

嘿,我遇到了类似的问题:Converting RGB to YUV, + ffmpeg

从AIR,我认为编码太长而无法以合理的速率渲染帧 - 所以我将bitmap.getPixels(rect)的argb ByteArray直接导出到文件中。

因此,对于30秒的Flash动画,我导出让我们说1500帧到1500 .argb个文件。

这种方法效果很好。我能够使用ffmpeg cmd渲染高清视频:

ffmpeg -f image2 -pix_fmt argb -vcodec rawvideo -s 640x380 -i frame_%d.argb -r 24 -qscale 1.1 -s 640x380 -i ./music.mp3 -shortest render-high.mpg

到目前为止一切顺利!但是,在这两个进程之间,我们需要存储大约3GB的数据。

然后我尝试将所有argb附加到一个文件中并让ffmpeg使用它,但没有得到任何好处...还尝试弄乱tcp / udp但卡住了......

有没有人知道如何简化这个过程并希望将Air和ffmpeg连接在一起?

1 个答案:

答案 0 :(得分:4)

您需要使用以下参数启动ffmpeg NativeProcess:

ffmpeg -f rawvideo -pix_fmt argb -s 640x480 -r 24 -i - -c libx264 -b:v 1024k video.mp4

在这里,您需要为视频(-b:v)和输出文件名指定输入帧大小(-s)帧速率(-r)和输出比特率。这些论点的顺序也很重要。

然后,您只需将bitmap.getPixels(rect)的字节数组与_process.standardInput.writeBytes(data, 0, data.bytesAvailable);逐帧地传递到此nativeProcess的standardInput。

偶尔会出现IOErrorEvent.STANDARD_INPUT_IO_ERROR - 这意味着ffmpeg无法跟上您的数据,并且帧将被丢弃。除了降低帧大小,帧速率或比特率之外,你无能为力 - 你可能想要为你的帧设置某种队列,但是高分辨率的未压缩图像非常大,所以你只能存储几十个它们在内存中,由于IO速度慢,您将无法将它们存储在磁盘上。这个问题只在处理高清视频编码时才会出现。

当您没有要发送的帧时调用_process.closeInput();并等待ffmpeg进程以代码0退出。