嘿,我遇到了一个类似的问题:将RGB转换为YUV,+ffmpeg
在AIR中,我认为编码太长,无法以合理的速率渲染帧,所以我将argbByteArray从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结合在一起吗?
您需要使用以下参数启动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)
逐帧传输到具有_process.standardInput.writeBytes(data, 0, data.bytesAvailable);
的本机进程的standardInput。
偶尔会发生IOErrorEvent.STANDARD_INPUT_IO_ERROR-这意味着ffmpeg无法跟上您的数据,帧将被丢弃。除了降低帧大小、帧速率或比特率之外,你对此无能为力-你可能想为你的帧设置某种队列,但高分辨率未压缩图像非常大,所以你只能在内存中存储几十个图像,而由于IO速度慢,你将无法将其存储在磁盘上。这个问题只在处理高清视频编码时才会出现。
当您没有更多的帧要发送时,调用_process.closeInput();
,并等待ffmpeg进程退出,代码为0。