LoginSignup
2
4

More than 3 years have passed since last update.

[OF] 再生できないビデオコーテック

Last updated at Posted at 2017-02-19

今回はoFで映像を再生する方法を書いていきたいと思います。
デフォルトであるのはofVideoPlayerというクラスですね。ただこのofVideoPlayerだと再生できない映像があったりします。ピクセル比が原因だったり、一部のコーデックが再生できなかったりします。
そこで僕が行った対処法がこちらです。

映像を再生するには

ofApp.h
ofVideoPlayer vid;
ofApp.cpp
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でテクスチャを別で用意してそこに映像を読み込んで渡してあげたら上手いこといきました。

ofApp.h
ofDirectShowPlayer dShow;
ofTexture tex, *ptrTex;
ofApp.cpp
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

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4