嘿,我遇到了类似的问题: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连接在一起?
答案 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退出。