Cocos2d-x3.1で、VideoPlayerが追加されたので、試しに使ってみた。 動画再生するのに結構ハマった。
Sceneとかに追加するコード
auto visibleSize = Director::getInstance()->getVisibleSize(); auto videoPlayer = cocos2d::experimental::ui::VideoPlayer::create(); videoPlayer->setContentSize(visibleSize); videoPlayer->setPosition(Vec2(visibleSize.width / 4, (visibleSize.height / 4 * 3))); videoPlayer->setScale(0.5); videoPlayer->setKeepAspectRatioEnabled(true); this->addChild(videoPlayer); auto menu = Menu::createWithItem(MenuItemLabel::create(Label::createWithSystemFont("Play", "Arial", 24), [videoPlayer](Ref *sender) { videoPlayer->setFileName("video.mp4"); videoPlayer->play(); } )); menu->setPosition(visibleSize / 2); this->addChild(menu);
最低限でこんな感じ。 これコピペして、"Play"押せば動画再生が始まるはず
ハマりどころ
共通
iOSとAndroidでContentSizeやPositionを共有できない
上記コード、iOSだと画面ピッタリに表示されるんだけど、Androidだと小さく表示される。 ↓下にも書いたんだけど、動画の表示位置を決める処理がおかしい気がする。 もしかしたら僕の使い方が間違ってるだけかもしれないんだけど、直したい。
iOS
動画が表示されるサイズとか位置がおかしい
setContentSizeとかやってるところみると、なんか変なことやってるんだけど、こうしないと画面ピッタリに動画を表示できない。
VideoPlayer::drawの中で、動画が再生される位置を調整してるんだけど、この中の処理のどこかがおかしいっぽい。直したい。
Android
setFileNameするタイミングによっては動画が再生されない
例示したコードでは、play()の前にsetFileNameしてるんだけど、最初はthis->addChildの前にsetFileNameしてた。
iOSの場合は、それで再生できるんだけど、Androidの場合は、VideoPlayer生成してから少し待たないといけない。
詳細はCocos2dxVideoView.java見て欲しいんだけど
1. mSurfaceHolderっていうのを準備するのに、非同期的な処理が走る。
1. android.media.MediaPlayer
用意するのにはmSurfaceHolderが必要
1. cppでsetFileNameした時にmSurfaceHolder == null
チェックして、nullだったら即returnする
1. mSurfaceHolderを用意するのは、一瞬で終わるが、VideoPlayer生成即setFileNameすると、それが間に合わない
みたいな感じ。 だから、現状だとplayの直前にsetFileName呼ぶのが確実っぽい。
experimental(実験的)なnamespaceなので、今後修正されるかもしれないし、VideoPlayer自体が消えるかもしれないけど、3.1.1で試した結果、こういうハマりどころがありましたよって話。