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

标签 actionscript-3 flash air stream ffmpeg

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

相关文章:

image - AS3/AIR/Mobile - 将位图保存到文件

actionscript-3 - 在Adobe Flash中无缝切换语言(音频和歌词)

flash - html5 vs flash - 任何地方的完整比较图表?

windows - 用户是否需要管理员权限才能安装 Flash Player?

flash - 流媒体视频,如 youtube、vimeo 等?我的自由和开源软件选项有哪些?

sqlite - Adobe Air SQLite 误解

actionscript-3 - as3删除flv播放类我仍然可以听到声音

ios - ActionScript 3 中 iPhone 的垂直滚动

actionscript-3 - 数组中的 AS3 变量不会更新,即使直接给出 "command"

air - 如何检测 AIR 应用程序中的窗口关闭事件以及如何防止