嘿,我遇到了类似的问题: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 连接在一起吗?
最佳答案
您需要使用如下参数启动 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 退出时。
关于actionscript-3 - AIR - 将位图数据传输到 FFmpeg 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11418978/