FBOをキャプりたい。

2014.04.23 openFrameworks 

ofxaddons.comで探してると、ofxQTKitVideoGrabberとかofxQTVideoSaverとかあったので色々使ってみたんだけど、
好きな範囲でキャプれなかったり、SDK6.0必要で入れたらカメラと同時起動出来なかったり、何かと制限ありそうだったのでパス。
んで0.8で使えるofxVideoRecorderを見つけたのでこちら使ってみることに。

ofxVideoRecorderのサンプル見れば分かるけど、ffmpeg使うよーとのこと。
まず開発機のMacにffmpeg入ってなかったので入れる。

ここは素直にhomebrewで入れた方がいい。こことか。
んでこの辺りを見てH.264用, aac, mp3あたりのコーデックを入れておく。

brewで入れたらこんな感じかな。

/usr/local/Cellar/ffmpeg/2.2/bin/ffmpeg

これを渡してやる。

ofxVideoRecorder.setFfmpegLocation(*****)

動いた。けど書き出し時にエラる、、、

んで原因これ。最新版2.2とかでは -strict オプションつけないとエラる仕様になってる。
http://www.teradas.net/archives/3105/

AudioCodec mp3
-acodec libmp3lame -strict unofficial
AudioCodec aac
-acodec aac -strict experimental

今回は.mp4の動画にしたかったのでAudioCodecはAAC使ってこんな感じで指定。

vidRecorder.setAudioCodec("aac -strict experimental");

あとはcapture用のFBO用意して、

ofFbo cap;
ofPixels p;
ofImage *img;

// setup
cap.allocate(640,480);
cap.begin();
    ofClear(0, 0, 0);
cap.end();
img = new ofImage;

// update
ofSetColor(255, 255, 255);
cap.begin();
{
    ofClear(0, 0, 0);
    ofPushMatrix();
    {
        ofTranslate(50, 50);
        vidGrabber.draw(0, 0);
    }
    ofPopMatrix();
}
cap.end();

img->clear();
cap.readToPixels(p);
// img->setFromPixels(p);    // FBOからのreadToPixelsはOF_COLOR_IMAGE_ALPHAなのでOF_IMAGE_COLORに変換必要
         
unsigned char * pixels = p.getPixels();
unsigned char pixs2[640*480*3];
for(int i = 0; i < 640*480; i++)
{
    pixs2[i*3]   = pixels[i*4];
    pixs2[i*3+1] = pixels[i*4+1];
    pixs2[i*3+2] = pixels[i*4+2];
}
img->setFromPixels(pixs2, 640, 480, OF_IMAGE_COLOR);
img->update();

// ビデオ書き込み
vidRecorder.addFrame(img->getPixelsRef());

カラーチャンネルの変換メソッドってないんかな??

・途中のエラーとか

Please use -b:a or -b:v, -b is ambiguous
Unknown encoder 'mp3'

途中mp3変換ライブラリ入れずに進んでて、mp3コーデックがねーよって怒られて書き出してもらえない。。
 → のでlame入れる。

brew install lame

とりあえずこれでoF上で好きな範囲を、絵と音のコーデック+ビットレート任意、フレームレート指定で映像書き出しできる。
めでたしめでたし。

you

© rettuce.com