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



嘿,我遇到了一个类似的问题:将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。

相关内容

  • 没有找到相关文章

最新更新