2

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

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

因此,对于 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 连接在一起的方法?

4

1 回答 1

4

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

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

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

然后,您只需逐帧将字节数组从管道bitmap.getPixels(rect)传输到此 nativeProcess 的标准输入_process.standardInput.writeBytes(data, 0, data.bytesAvailable);

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

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

于 2012-12-08T11:49:12.070 回答