読者です 読者をやめる 読者になる 読者になる

cocos2d::experimental::ui::VideoPlayer を試す

Cocos2d-x

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"押せば動画再生が始まるはず

ハマりどころ

共通

iOSAndroidで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で試した結果、こういうハマりどころがありましたよって話。