cocos2dx 3.3 视频播放的实现-VideoPlayer的使用

cocos2dx 3.3 视频播放的实现-VideoPlayer的使用,第1张

概述最近因为项目需求需要使用到视频播放功能。 在3.x版本之前如果需要用到视频播放功能就要使用原生的视频播放实现技术,好在3.x之后官方已经集成了视频播放功能,这是值得欣慰的。但是欣慰过后的悲剧在于,官方的文档一直跟不上版本的更新速度。虽然集成了这个功能,但是郁闷的是你要花费很大的力气去尝试使用技巧(仅限于类似我这种菜鸟)。 以下为我整了好久才摸到的使用方法,其实使用不难,难的是一定要注意这个集成的播

最近因为项目需求需要使用到视频播放功能。

在3.x版本之前如果需要用到视频播放功能就要使用原生的视频播放实现技术,好在3.x之后官方已经集成了视频播放功能,这是值得欣慰的。但是欣慰过后的悲剧在于,官方的文档一直跟不上版本的更新速度。虽然集成了这个功能,但是郁闷的是你要花费很大的力气去尝试使用技巧(仅限于类似我这种菜鸟)。

以下为我整了好久才摸到的使用方法,其实使用不难,难的是一定要注意这个集成的播放器(VIDeoPlayer)是有平台限制的。一些代码只有在androID平台和IOS平台有效。废话不多说了,直接上实例代码:

HelloWorldScene.h文件

[cpp] view plain copy print ? #ifndef__HELLOWORLD_SCENE_H__ #define__HELLOWORLD_SCENE_H__ #include"cocos2d.h" //务必引入以下2个.h文件 #include"ui/UIVIDeoPlayer.h" #include"ui/CocosGUI.h" USING_NS_CC; classHelloWorld:publicLayer { public: staticScene*createScene(); virtualboolinit(); voIDonEnter(); voIDvIDeoPlayOverCallback(); voIDshowVIDeo(); /** @H_419_156@*视频播放状态,只有在androID和ios平台有效 */ #if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID||CC_TARGET_PLATFORM==CC_PLATFORM_IOS) voIDvIDeoEventCallback(Ref*sender,cocos2d::experimental::ui::VIDeoPlayer::EventTypeeventType); #endif CREATE_FUNC(HelloWorld); }; #endif
HelloWorldScene.cpp文件

? #include"HelloWorldScene.h" USING_NS_CC; Scene*HelloWorld::createScene() autoscene=Scene::create(); autolayer=HelloWorld::create(); scene->addChild(layer); returnscene; } boolHelloWorld::init() { if(!Layer::init()) returnfalse; returntrue; voIDHelloWorld::onEnter(){ Layer::onEnter(); showVIDeo(); } voIDHelloWorld::showVIDeo(){ Sizesize=Director::getInstance()->getVisibleSize(); autovIDeoPlayer=cocos2d::experimental::ui::VIDeoPlayer::create(); vIDeoPlayer->setposition(Point(size.wIDth/2,size.height/2)); vIDeoPlayer->setAnchorPoint(Vec2::ANCHOR_MIDDLE); vIDeoPlayer->setContentSize(Size(size.wIDth,size.height)); this->addChild(vIDeoPlayer); if(vIDeoPlayer) vIDeoPlayer->setfilename("1111.mp4"); vIDeoPlayer->play(); vIDeoPlayer->addEventListener(CC_CALLBACK_2(HelloWorld::vIDeoEventCallback,this)); @H_419_156@*视频播放完成的回调函数 voIDHelloWorld::vIDeoPlayOverCallback() /** *视频播放的状态 @H_419_156@*注意这里的代码,此处代码只有在androID平台和Ios平台有效 voIDHelloWorld::vIDeoEventCallback(Ref*sender,cocos2d::experimental::ui::VIDeoPlayer::EventTypeeventType){ switch(eventType){ casecocos2d::experimental::ui::VIDeoPlayer::EventType::PLAYING: break; casecocos2d::experimental::ui::VIDeoPlayer::EventType::PAUSED: casecocos2d::experimental::ui::VIDeoPlayer::EventType::StopPED: casecocos2d::experimental::ui::VIDeoPlayer::EventType::COMPLETED: vIDeoPlayOverCallback(); break; default:

如此即可实现视频播放了,对视频的控制请参考官方demo

================================下面是另一篇博客的记录========

Cocos2d-x v2.2.1版本

下面简单实现Cocos2d-x一个视频播放的模块,需要播放视频时,不用到处乱改了,一句代码搞定!

一. IOS播放本地视频

对于IOS平台的视频播放,这里直接使用MediaPlayer.framework来播放视频

注意:MediaPlayer.framework播放视频格式有限,可能需要转换为指定的视频格式才能播放!

1.添加MediaPalyer框架到项目中

2.简单写三个类

VIDeoPlatform,IOSPlayVIDeo,IOSVIDeoController

1)VIDeoPlatform 这个类用来判断播放视频的平台,从而调用各自平台的视频播放接口

VIDeoPlatform.h

[cpp] view plain copy #ifndef__Platform_H_H__ #define__Platform_H_H__ #include"cocos2d.h" usingnamespacecocos2d; classVIDeoPlatform { public: //在当前的layer上播放视频,视频完毕或者点击跳过视频会跳转到指定的layer上(默认为空,也就是停留在当前layer上) staticvoIDplayVIDeo(constchar*filename,cclayer*layer=NulL); }; #endif//__Platform_H_H__

VIDeoPlatform.cpp

#include"VIDeoPlatform.h" #include"../../cocos2dx/platform/CCPlatformConfig.h" #if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) #include<jni.h> #include"../../cocos2dx/platform/androID/jni/JniHelper.h" #include<androID/log.h> #elif(CC_TARGET_PLATFORM==CC_PLATFORM_IOS) #include"IOSPlayVIDeo.h" #endif voIDVIDeoPlatform::playVIDeo(#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID) //AndroID视频播放代码 JniMethodInfominfo; boolisHave=JniHelper::getmethodInfo(minfo,"org/cocos2dx/vIDeo/vIDeo","playVIDeo","()V"); if(isHave){ minfo.env->CallStaticVoIDMethod(minfo.classID,minfo.methodID); } //iOS视频播放代码 IOSPlayVIDeo::playVIDeoForIOS(filename,layer); }

2) IOSPlayVIDeo是IOS平台播放视频的接口

IOSPlayVIDeo.h

#ifndef__IOSPlayVIDeo_H_H__ #define__IOSPlayVIDeo_H_H__ #include"cocos2d.h" namespacecocos2d; classIOSPlayVIDeo { public: voIDplayVIDeoForIOS(}; #endif//__IOSPlayVIDeo_H_H__
IOSPlayVIDeo.mm

#include"IOSPlayVIDeo.h" #include"IOSVIDeoController.h" voIDIOSPlayVIDeo::playVIDeoForIOS( Nsstring*audioname=[NsstringstringWithUTF8String:filename]; IOSVIDeoController*app=[[IOSVIDeoControlleralloc]init]; [appplayVIDeo:audioname:layer]; }

3)最后IOSVIDeoController这个类就是ios播放视频的具体实现了

IOSVIDeoController.h

#import"MediaPlayer/MediaPlayer.h" #import"cocos2d.h" #include"SimpleAudioEngine.h" namespaceCocosDenshion; @interfaceIOSVIDeoController:MPMovIEPlayerVIEwController MPMovIEPlayerController*movePlayer; UIWindow*window; cclayer*TargetLayer; //播放网络视频 -(voID)playUrlVIDeo; //在当前场景上播放视频,播完或者点击跳过视频到指定的场景 -(voID)playVIDeo:(Nsstring*)filename:(cclayer*)targetLayer; @end

IOSVIDeoController.mm

#import"IOSVIDeoController.h" #import"AppController.h" @implementationIOSVIDeoController //播放网络视频 voID)playUrlVIDeo } voID)playVIDeo:(Nsstring*)filename:(cclayer*)targetLayer TargetLayer=targetLayer; //跳转Layer非空 if(targetLayer){ TargetLayer->retain(); SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); SimpleAudioEngine::sharedEngine()->pauseAllEffects(); Nsstring*myfilePath=[[NSBundlemainBundle]pathForResource:filenameofType:nilinDirectory:nil]; NSURL*url=[NSURLfileURLWithPath:myfilePath]; movePlayer=[[MPMovIEPlayerControlleralloc]initWithContentURL:url]; [[NSNotificationCenterdefaultCenter]addobserver:selfselector:@selector(movIEFinished:)name:MPMovIEPlayerPlaybackDIDFinishNotificationobject:movePlayer]; if([movePlayerrespondsToSelector:@selector(setFullscreen:animated:)]) movePlayer.shouldAutoplay=YES; CCSizewinSize=CCDirector::sharedDirector()->getWinSize(); cclog("winSize.wIDth====%fwinSize.height====%f",winSize.wIDth,winSize.height); //这里iPad2和ipad3视频位置调整是正确的,Iphone可能需要细微调整 if([[UIDevicecurrentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone) movePlayer.vIEw.frame=CGRectMake(-80,80,480,320); elseif([[UIDevicecurrentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPad) movePlayer.vIEw.frame=CGRectMake(-128,128,winSize.height); else //强制横屏 CGAffinetransformlandscapetransform; UIDevice*device=[UIDevicecurrentDevice]; if(device.orIEntation==UIDeviceOrIEntationLandscapeleft) landscapetransform=CGAffinetransformMakeRotation(M_PI/2); else landscapetransform=CGAffinetransformMakeRotation(-M_PI/2); movePlayer.vIEw.transform=landscapetransform; //新建一个window,添加视频这个UIVIEw window=[[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]]; [windowaddSubvIEw:movePlayer.vIEw]; [windowmakeKeyAndVisible]; //在视频上方添加“跳过”按钮 CGRectframe=CGRectMake(768-100,100,50); UIbutton*button=[UIbuttonbuttonWithType:UIbuttonTypeRoundedRect]; button.frame=frame; [buttonsetTitle:@"跳过"forState:UIControlStatenormal]; button.transform=landscapetransform; button.backgroundcolor=[UIcolorclearcolor]; button.tag=2000; [buttonaddTarget:selfaction:@selector(buttonClicked:)forControlEvents:UIControlEventtouchUpInsIDe]; [windowaddSubvIEw:button]; //设置是否带控制条 movePlayer.controlStyle=MPMovIEControlStyleNone; [[NSNotificationCenterdefaultCenter]addobserver:selfselector:@selector(exitFullScreen:)name:MPMovIEPlayerDIDExitFullscreenNotificationobject:nil]; movePlayer.controlStyle=MPMovIEControlModeHIDden; [selfplayMovIE]; //跳过视频 -(IBAction)buttonClicked:(ID)sender{ [movePlayerstop]; [movePlayer.vIEwremoveFromSupervIEw]; [movePlayerrelease]; [windowrelease]; SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); SimpleAudioEngine::sharedEngine()->resumeAllEffects(); if(!TargetLayer){ return; TargetLayer->removeAllChildrenWithCleanup(true); TargetLayer->removeFromParent(); CCScene*scene=CCScene::create(); scene->addChild(TargetLayer,10); CCDirector::sharedDirector()->replaceScene(scene); //播放开始 voID)playMovIE MPMovIEPlaybackStatestate=movePlayer.playbackState; if(state==MPMovIEPlaybackStatePlaying) NSLog(@"MovIEisalreadyplaying."); [movePlayerplay]; //退出全屏 voID)exitFullScreen:(NSNotification*)notification{ cclOG("exitFullScreen"); movePlayer.controlStyle=MPMovIEControlStyleDefault; [movePlayer.vIEwremoveFromSupervIEw]; //视频播放结束 voID)movIEFinished:(NSNotificationCenter*)notification{ //cclOG("movIEPlaybackFinished"); //视频播放完毕 if(state==MPMovIEPlaybackStateStopped){ NSLog(@"MovIEisalreadystopped."); return; [[NSNotificationCenterdefaultCenter]removeObserver:selfname:MPMovIEPlayerPlaybackDIDFinishNotificationobject:movePlayer]; [windowrelease]; CCScene*scene=CCScene::create(); scene->addChild(TargetLayer,10); CCDirector::sharedDirector()->replaceScene(scene); voID)dealloc{ [superdealloc]; if(TargetLayer){ TargetLayer->release(); @end


 

IOS项目里只需在需要的地方调用接口

//只在当前layer上播放视频,播完不跳转就调这个

VIDeoPlatform::playVIDeo("test.mp4");

//当前layer上播放视频,播完跳转到指定layer就调这个

VIDeoPlatform::playVIDeo("test.mp4",TestLayer::create());

就可以播放视频了!有没有发觉世界瞬间变得美好了一点呢?

二.IOS播放网络视频

只需将

NSURL*url=[NSURLfileURLWithPath:myfilePath]; 类似改为:

NSURL*url=[NSURLURLWithString:@"http://127.0.0.1/test.mp4"];

(后面填写视频地址就OK!)


三.AndroID 播放本地视频

至于AndroID就稍微麻烦一点,需要用到Jni 技术,C++调用java

1) 添加一个VIDeoActivity

[java] packageorg.cocos2dx.vIDeo; importandroID.app.Activity; importandroID.content.pm.ActivityInfo; importandroID.media.MediaPlayer; importandroID.net.Uri; importandroID.os.Bundle; importandroID.vIEw.Window; importandroID.vIEw.WindowManager; importandroID.Widget.MediaController; importandroID.Widget.VIDeoVIEw; publicclassVIDeoActivityextendsActivity{ @OverrIDe protectedvoIDonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestwindowFeature(Window.FEATURE_NO_Title); getwindow().setFlags(WindowManager.LayoutParams.FLAG_FulLSCREEN, WindowManager.LayoutParams.FLAG_FulLSCREEN); getwindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setRequestedOrIEntation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//强制为横屏 setContentVIEw(R.layout.vIDeovIEw); finalVIDeoVIEwvIDeoVIEw=(VIDeoVIEw)findVIEwByID(R.ID.VIDeoVIEw01); vIDeoVIEw.setVIDeoURI(Uri.parse("androID.resource://"+getPackagename()+"/"+R.raw.theme)); vIDeoVIEw.start(); //视频播控制条设置 MediaControllercontroller=newMediaController(VIDeoActivity.this); vIDeoVIEw.setMediaController(controller); //播放完成监听 vIDeoVIEw.setonCompletionListener(newMediaPlayer.OnCompletionListener() @OverrIDe voIDonCompletion(MediaPlayermp) //播放结束后的动作,返回点击播放视频的那个页面 finish(); }); }

2) 修改AndroIDManifest.xml,添加一个Activity

[HTML] <activityandroID:name="VIDeoActivity" androID:label="@string/app_name" androID:screenorIEntation="landscape" androID:theme="@androID:style/theme.NoTitlebar.Fullscreen" androID:configChanges="orIEntation"> intent-filter> actionandroID:name="androID.intent.action.MAIN"/> categoryandroID:name="androID.intent.category.DEFAulT"/> </activity>


3) 在res /layout添加一个 vIDeovIEw.xml

<?xmlversion="1.0"enCoding="utf-8"?> relativeLayoutxmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:gravity="center" tools:context=".VIDeoActivity"VIDeoVIEw androID:ID="@+ID/VIDeoVIEw01" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" androID:layout_alignParentleft="true" androID:layout_alignParentRight="true" androID:layout_alignParenttop="true" androID:orIEntation="horizontal" androID:theme="@androID:style/theme.NoTitlebar.Fullscreen"relativeLayout>


4)在res 下添加一个raw文件夹,里面放你要播放的视频,例如:theme.mp4,这里我的视频文件名为theme


5)修改vIDeo.java (我的AndroID 项目包名为 org.cocos2dx.vIDeo)

importorg.cocos2dx.lib.Cocos2dxActivity; importorg.cocos2dx.lib.Cocos2dxGLSurfaceVIEw; importandroID.content.Intent; classvIDeoextendsCocos2dxActivity{ staticvIDeoinstance; staticIntentintent; instance=this; intent=newIntent(vIDeo.this,VIDeoActivity.class); voIDplayVIDeo() instance.startActivity(intent); publicCocos2dxGLSurfaceVIEwonCreateVIEw(){ Cocos2dxGLSurfaceVIEwglSurfaceVIEw=newCocos2dxGLSurfaceVIEw(//vIDeoshouldcreatestencilbuffer glSurfaceVIEw.setEGLConfigChooser(5,6,0); background-color:inherit">0,0); background-color:inherit">16,0); background-color:inherit">8); returnglSurfaceVIEw; static{ System.loadlibrary("cocos2dcpp"); }


至此 AndroID播放本地视频就OK了!

四.AndroID 播放网络视频


新添加一个如下方法即可(同样也可以使用JNI C++调Java)

voIDplayURLVIDeo() Intentintent=newIntent(Intent.ACTION_VIEW); Stringtype="vIDeo/*"; Uriuri=Uri.parse("http://forum.ea3w.com/coll_ea3w/attach/2008_10/12237832415.3gp"); intent.setDataAndType(uri,type); instance.startActivity(intent); } 总结

以上是内存溢出为你收集整理的cocos2dx 3.3 视频播放的实现-VideoPlayer的使用全部内容,希望文章能够帮你解决cocos2dx 3.3 视频播放的实现-VideoPlayer的使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1048572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存