2

ねえ、私は次のような同様の問題に直面しています:RGBからYUVへの変換、+ ffmpeg

AIRから、エンコーディングが長すぎてフレームを妥当な速度でレンダリングできないことがわかりました。そのため、argbByteArrayをからbitmap.getPixels(rect)直接ファイルにエクスポートしました。

したがって、30秒のフラッシュアニメーションの場合、たとえば1500フレームを1500.argbファイルにエクスポートします。

この方法はうまく機能します。ffmpegcmdを使用してHDビデオをレンダリングできました。

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

ここまでは順調ですね!ただし、2つのプロセスの間に、これらの最大3GBのデータを保存する必要があります。

次に、すべてのargbを1つのファイルに追加して、ffmpegにそれを消費させようとしましたが、それから何も得られませんでした... tcp / udpをいじってみましたが、スタックしました...

そのプロセスを合理化し、うまくいけばAirとffmpegの両方を一緒にパイプする方法を知っている人はいますか?

4

1 に答える 1

4

次のような引数で 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のstandardInputに_process.standardInput.writeBytes(data, 0, data.bytesAvailable);フレームごとにパイプするだけです。

ときどき IOErrorEvent.STANDARD_INPUT_IO_ERROR が発生します。これは、ffmpeg がデータに追いつかず、フレームがドロップされることを意味します。フレーム サイズ、フレーム レート、またはビットレートを下げること以外にできることはありません。フレーム用にある種のキューが必要になる場合がありますが、高解像度の非圧縮画像は非常に大きいため、数十個しか保存できません。それらをメモリに保存すると、IO 速度が遅いためディスクに保存できなくなります。この問題は、HD ビデオ エンコーディングを処理する場合にのみ発生します。

_process.closeInput();送信するフレームがなくなったときに呼び出し、ffmpeg プロセスがコード 0 で終了するのを待ちます。

于 2012-12-08T11:49:12.070 に答える