2012-03-26 56 views
3

私はglReadPixels()から生成されたrgbデータの配列を持っています。
RGBデータはピクセルパック(r1、g1、b1、r2、g2、b2、...)であることに注意してください。OpenCVまたは他の画像処理ライブラリを使用してRGBデータからYUV 420ビデオフレームを書き込む方法は?

OpenCVまたは別のC++ライブラリを使用してYUVビデオフレームをすばやく書き込むことができます。そのため、FFMPEGにストリームすることができますか? RGBピクセルをYUVピクセルに変換することは、オンラインで利用可能な変換式が数多くあるため問題にはなりません。しかし、YUVフレームを書くことが私の主な問題です。私は最後の数日からYUVビデオフレームを書き込もうとしていて、それを成功させることはできませんでした。

これは、私が遭遇した問題とYUVフレームの書き方についての私の他の質問の1つです。Issue with writing YUV image frame in C/C++ YUVフレームをファイルに書き込む際の私の現在のアプローチが何であるか分かりません。

これで、既存のライブラリ(存在する場合)を使用し、RGBデータを受け入れてYUVに変換し、YUVフレームをファイルまたはパイプに直接書き込むことができます。もちろん、私の既存のプログラムを修正してYUVフレームを書くことができればもっと良いでしょうが、すべてのソフトウェア開発プロジェクトに期限がありますので、私とプロジェクトチームのメンバーにとっても時間が優先されます。

+0

FFMPEGでswscaleを試しましたか? swscaleでピクセル形式とスケーリング画像を変換するには、3行のコードが必要です。 – BlueWanderer

+1

YUVデータをFFmpegにストリームする必要があるのはなぜですか?なぜRGBデータをフィードしないのですか? – TheJuice

+0

YUVフレームを書き込むためのライブラリは必要ありません。 RGBデータをY、U、Vに変換できると言ったのですが、そのデータを同じ順序でファイルに書き込んでください。代替値を取ってU&Vをサブサンプルすることができます。それから、そのファイルを見るには良いYUVプレーヤーが必要です。私はこれを何度もやってきました。とても簡単です。 – nac

答えて

0

OpenCVはYUV形式を直接サポートしていませんので、実際にはRGB < - > YUVの変換方法を見つけるのはあなた次第です。

This is a very interesting postIplImageとしてデータを格納しながら、ディスクにYUVフレームをロードし、作成するを示しています。

0

ffmpegはYUVでAVIファイルを書きますが、karlはopenCVで直接サポートしていないと言っています。

また、生のUYVY値をファイルに書き込んだり、ffmpegを使って任意の形式のAVI/MP4に変換することができます。パイプに直接書き込んで、アプリケーションから直接yuvファイルを避けてffmpegを呼び出すことも可能です

例: H264のMP4ファイルにHD YUV422ストリームを変換するためのFFmpegは喜んでRGBデータを受信します30fpsの

ffmpeg -pix_fmt yuyv422 -s 1920x1080 -i input.yuv -vcodec libx264 -x264opts -r 30 output.mp4

+0

OpenGLアプリケーションを実行していて、glReadPixelsを使用してアニメーション表示をキャプチャしたい場合、このデータをFFMPEGにパイプし、Red5を使用してRTMPライブストリーミングとしてWebブラウザにストリームします。私はkylecordes.com/2007/pipe-ffmpegや他の関連ウェブサイトから、FFMPEGがパイプを通じてRTMPストリーミングデータを受け取ることができたが、データはYUVビデオフレームフォーマットでエンコードされなければならないことを知った。あなたは私を正しいアプローチに導くことができますか?ここに私の現在のアプローチhttp://stackoverflow.com/questions/9858388/ http://wiki.multimedia.cx/index.php?title=YUV4MPEG2から参照してください –

+0

@all_by_grace - あなたはRGBで画面を読んでいる場合これらの値を直接書くのは簡単ではないでしょうか? ffmpegとopenCVはどちらもRGBピクセル形式からビデオを作成できます。あなたは非常に空想的なシステムを持っていない限り、どちらの場合でも非常に高いフレームレートを処理することはできません –

2

であなたはFFmpegのは、実行することにより、サポートフォーマット何ピクセル見ることができます。

ffmpeg -pix_fmts 

任意のエントリ第1列のIを入力として使用することができます。

ピクセルビット深度を指定していないので、私はそれを8ビットと仮定してrgb8ピクセル形式を使用します。

cat data.rgb | ffmpeg -f rawvideo -pix_fmt rgb8 -s WIDTHxHEIGHT -i pipe:0 output.mov 

それはなしフレーミングと生のピクセル形式ですので:だからあなたは(私はcat INGデータを午前しかし、あなたはあなたのパイプを経由して供給されます)、次のコマンドを使用しますstdinからRGB8データを読み取るためにFFmpegを取得しますFFmpegがどのようにデータをフレーム化するかを知るためには、あなたのイメージ次元の適切な値のためにWIDTHとHEIGHTを補助する必要があります。

出力をMOVファイルとして指定しましたが、それに応じてFFmpeg/Red5出力を設定する必要があります。

関連する問題