今回はoFで映像を再生する方法を書いていきたいと思います。
デフォルトであるのはofVideoPlayerというクラスですね。ただこのofVideoPlayerだと再生できない映像があったりします。ピクセル比が原因だったり、一部のコーデックが再生できなかったりします。
そこで僕が行った対処法がこちらです。
映像を再生するには
ofVideoPlayer vid;
void ofApp::setup(){
vid.load("sample.mp4");//dataフォルダ内の映像データの読み込み
}
void ofApp::update(){
vid.update();//毎フレーム更新
}
void ofApp::draw(){
if(vid.isFrameNew(){//映像フレームが更新されたか確認
vid.draw(0,0,ofGetWidth(),ofGetHeight());//描画
}
}
はい。ofVideoPlayerでやるならこんな感じですね。大概のデータはこれで再生できますが、もしデータ読み込みの段階で怒られたり何らかの原因で再生ができない場合は下記の方法を試してみてください。
ofxDirectShowPlayer
https://github.com/motoishmz/ofxDirectShowPlayer
こちらofxDirectShowPlayerというaddonでございます。ofVideoPlayerで再生できなかった場合はこちらをお試しあれ。
使い方はofVideoPlayerと同じです。
ofxDirectShowPlayerでテクスチャを取得する
以前僕が詰まったところで、特殊なピクセル比の映像をテクスチャで渡さないといけない状況になったのですが、ofDirectShowPlayerはofVideoPlayerで標準であるgetTexture()関数というが無いのです。
代わりにgetTexturePtr()というポインタを返してくれる関数があったのですが、こちら、nullポインタしか返してくないという謎使用...なんでだろう。
そこで一度ofTextureでテクスチャを別で用意してそこに映像を読み込んで渡してあげたら上手いこといきました。
ofDirectShowPlayer dShow;
ofTexture tex, *ptrTex;
void ofApp::setup(){
dShow.load("sample.mp4");//動画読み込み
}
void ofApp::update(){
dShow.update();
if(dShow.isFrameNew()){
tex.loadData(dShow.getPixels());//texに読み込む
ptrTex->loadData(dShow.getPixels());//ポインタであるptrTexに読み込む
}
}
void ofApp::draw(){
tex.draw(0, 0,ofGetWidth() / 2, ofGetHeight());
ptrTex->draw(ofGetWidth() / 2, 0,ofGetWidth() / 2, ofGetHeight());
}
みたいな感じでテクスチャとして扱うことができます。このテクスチャにポインタをつけてあげれば、結果的にdShowのアドレスを握ったも同然です。
これで別クラスに渡して量産しても実態は一つなので負荷を抑えることができます。
ちょっと回りくどい感じがするし分かりづらいですが、とりあえずは動くようになります。
...なんかこれじゃない感がありますが。
もっと他にいい方法ご存知の方、ご教授願います(笑)
getTexturePtr()とは一体...
hapコーデックの場合はこちらをお試しください↓
https://github.com/secondstory/ofxDSHapVideoPlayer