cocos2d-x IOS 和Android播放视频(包括网络视频)

    xiaoxiao2025-12-06  2

    一. 播放本地视频

         对于iOS平台的视频播放,我们可以借助Cocos2d-iphone 的Extensions:CCVideoPlayer来实现

        1.导入支持cocos2d-x的扩展库到项目中(这里可以参考Himi的第六章视频播放小节内容,这里的扩展库是Himi修改好的,我就直接拿来用了!希望没有侵权!)

        2.添加MediaPalyer框架到项目中

        3.修改ios里AppController.h 和AppController.mm文件

         AppController.h  

    [plain]  view plain copy #import "../Classes/CCVideoPlayeriOS/CCVideoPlayer.h"   @class RootViewController;   @interface AppController : NSObject <UIAccelerometerDelegate, UIAlertViewDelegate,    UITextFieldDelegate,UIApplicationDelegate,CCVideoPlayerDelegate>    {       UIWindow *window;       RootViewController    *viewController;   }   @property (nonatomic, retain) UIWindow *window;   @property (nonatomic, retain) RootViewController *viewController;   -(void)playVideo;   @end  

     AppController.mm

    添加using namespace cocos2d;

     因为playVideo用到了cocos2d-x里的api

    CCSizesize = CCDirector::sharedDirector()->getWinSize();

    在application函数里添加视频播放监听

    [CCVideoPlayer setDelegate :self];

    playVideo实现如下:

    [plain]  view plain copy -(void)playVideo   {      CCSize size = CCDirector::sharedDirector()->getWinSize();      [CCVideoPlayer setScrrenSize:CGSizeMake(size.width-400, size.height-300)];      [CCVideoPlayer setNoSkip:true];      [CCVideoPlayer playMovieWithFile:@"xcm.mp4"];   //  播放网络视频   // [viewController playURLVideo];    }  

    4.添加混编类IOSPlayVideo

    IOSPlayVideo.h

    [plain]  view plain copy #ifndef __IOSPlayVideo_SCENE_H__   #define __IOSPlayVideo_SCENE_H__   class IOSPlayVideo    {    public:       static void playVideoForIOS();          };      #endif // __IOSPlayVideo_SCENE_H__  

    IOSPlayVideo.mm

    [plain]  view plain copy #include "IOSPlayVideo.h"   #include "AppController.h"   void IOSPlayVideo::playVideoForIOS()   {       AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];       [app playVideo];   }  

    5.添加一个cocos2d-x类 :Platform

    Platform.h

    [plain]  view plain copy #ifndef __Platform_SCENE_H__   #define __Platform_SCENE_H__   #include "cocos2d.h"      using namespace cocos2d;   class Platform    {    public:       static void playVideo();//用于播放本地视频       static void playURLVideo();//用于播放网络视频   };      #endif // __Platform_SCENE_H__  

    Platform.mm

    [plain]  view plain copy #include "Platform.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      void Platform::playVideo()   {   #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)       //Android播放本地视频       JniMethodInfo minfo;       bool isHave = JniHelper::getMethodInfo(minfo,"org/cocos2dx/playvideo/playvideo","playVedio", "()V");       if (isHave)        {           minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);       }   #elif(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)       //IOS播放本地视频       IOSPlayVideo::playVideoForIOS();   #endif   }      void Platform::playURLVideo()   {   #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)       //Android播放网络视频       JniMethodInfo minfo;       bool isHave = JniHelper::getMethodInfo(minfo,"org/cocos2dx/playvideo/playvideo","playURLVideo", "()V");       if (isHave)        {           minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);       }   #elif(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)       //IOS播放网络视频       IOSPlayVideo::playVideoForIOS();   #endif   }  

    IOS项目里只需在需要的地方调用函数就可以播放视频了!

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

    A.修改playvideo.java

    修改后如下:

    [java]  view plain copy package org.cocos2dx.playvideo;      import org.cocos2dx.lib.Cocos2dxActivity;   import org.cocos2dx.lib.Cocos2dxEditText;   import org.cocos2dx.lib.Cocos2dxGLSurfaceView;   import org.cocos2dx.lib.Cocos2dxRenderer;      import android.app.ActivityManager;   import android.content.Context;   import android.content.Intent;   import android.content.pm.ConfigurationInfo;   import android.os.Bundle;   import android.util.Log;   import android.view.ViewGroup;   import android.widget.FrameLayout;      public class playvideo extends Cocos2dxActivity {       //当前类实例       public static playvideo instance;       //用于切换Activity       public static Intent intent;              protected void onCreate(Bundle savedInstanceState){           super.onCreate(savedInstanceState);              instance =this;           if (detectOpenGLES20()) {               // get the packageName,it's used to set the resource path               String packageName = getApplication().getPackageName();               super.setPackageName(packageName);                              // FrameLayout               ViewGroup.LayoutParams framelayout_params =                   new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,                                              ViewGroup.LayoutParams.FILL_PARENT);               FrameLayout framelayout = new FrameLayout(this);               framelayout.setLayoutParams(framelayout_params);                  // Cocos2dxEditText layout               ViewGroup.LayoutParams edittext_layout_params =                   new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,                                              ViewGroup.LayoutParams.WRAP_CONTENT);               Cocos2dxEditText edittext = new Cocos2dxEditText(this);               edittext.setLayoutParams(edittext_layout_params);                  // ...add to FrameLayout               framelayout.addView(edittext);                  // Cocos2dxGLSurfaceView               mGLView = new Cocos2dxGLSurfaceView(this);                  // ...add to FrameLayout               framelayout.addView(mGLView);                  mGLView.setEGLContextClientVersion(2);               mGLView.setCocos2dxRenderer(new Cocos2dxRenderer());               mGLView.setTextField(edittext);                  // Set framelayout as the content view               setContentView(framelayout);                                                            intent = new Intent(playvideo.this, VedioActivity.class);                          }           else {               Log.d("activity""don't support gles2.0");               finish();           }          }              void playVideo()       {         instance.startActivity(intent);                  }               @Override        protected void onPause() {            super.onPause();            mGLView.onPause();        }           @Override        protected void onResume() {            super.onResume();            mGLView.onResume();        }                private boolean detectOpenGLES20()         {            ActivityManager am =                   (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);            ConfigurationInfo info = am.getDeviceConfigurationInfo();            return (info.reqGlEsVersion >= 0x20000);        }               static {            System.loadLibrary("game");        }      }   添加两个.java文件:VideoView.java和VedioActivity.java

    VideoView.java

    [java]  view plain copy package org.cocos2dx.playvideo;      import java.io.IOException;      import android.content.Context;   import android.content.Intent;   import android.media.AudioManager;   import android.media.MediaPlayer;   import android.media.MediaPlayer.OnCompletionListener;   import android.media.MediaPlayer.OnErrorListener;   import android.net.Uri;   import android.util.AttributeSet;   import android.view.KeyEvent;   import android.view.MotionEvent;   import android.view.SurfaceHolder;   import android.view.SurfaceHolder.Callback;   import android.view.SurfaceView;   import android.view.View;   import android.view.ViewGroup.LayoutParams;   import android.widget.MediaController;   import android.widget.MediaController.MediaPlayerControl;      public class VideoView extends SurfaceView implements MediaPlayerControl,Callback {             private Context mContext;          // settable by the client       private Uri mUri;       private int mDuration;          // All the stuff we need for playing and showing a video       private SurfaceHolder mSurfaceHolder = null;       private MediaPlayer mMediaPlayer = null;       private boolean mIsPrepared;       private int mVideoWidth;       private int mVideoHeight;       private int mSurfaceWidth;       private int mSurfaceHeight;       private MediaController mMediaController;       private OnCompletionListener mOnCompletionListener;       private MediaPlayer.OnPreparedListener mOnPreparedListener;       private int mCurrentBufferPercentage;       private OnErrorListener mOnErrorListener;       private boolean mStartWhenPrepared;       private int mSeekWhenPrepared;          private MySizeChangeLinstener mMyChangeLinstener;          public int getVideoWidth() {           return mVideoWidth;       }          public int getVideoHeight() {           return mVideoHeight;       }          public void setVideoScale(int width, int height) {           LayoutParams lp = getLayoutParams();           lp.height = height;           lp.width = width;           setLayoutParams(lp);       }          public interface MySizeChangeLinstener {           public void doMyThings();       }          public void setMySizeChangeLinstener(MySizeChangeLinstener l) {           mMyChangeLinstener = l;       }          public VideoView(Context context) {           super(context);           mContext = context;           initVideoView();       }          public VideoView(Context context, AttributeSet attrs) {           this(context, attrs, 0);           mContext = context;           initVideoView();       }          public VideoView(Context context, AttributeSet attrs, int defStyle) {           super(context, attrs, defStyle);           mContext = context;           initVideoView();       }          @Override       protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {            //Log.i("@@@@", "onMeasure");           int width = getDefaultSize(mVideoWidth, widthMeasureSpec);           int height = getDefaultSize(mVideoHeight, heightMeasureSpec);           /*           * if (mVideoWidth > 0 && mVideoHeight > 0) { if ( mVideoWidth * height           * > width * mVideoHeight ) { //Log.i("@@@",           * "image too tall, correcting"); height = width * mVideoHeight /           * mVideoWidth; } else if ( mVideoWidth * height < width * mVideoHeight           * ) { //Log.i("@@@", "image too wide, correcting"); width = height *           * mVideoWidth / mVideoHeight; } else { //Log.i("@@@",           * "aspect ratio is correct: " + //width+"/"+height+"="+           * //mVideoWidth+"/"+mVideoHeight); } }           */           // Log.i("@@@@@@@@@@", "setting size: " + width + 'x' + height);           setMeasuredDimension(width, height);       }          public int resolveAdjustedSize(int desiredSize, int measureSpec) {           int result = desiredSize;           int specMode = MeasureSpec.getMode(measureSpec);           int specSize = MeasureSpec.getSize(measureSpec);              switch (specMode) {           case MeasureSpec.UNSPECIFIED:               /*               * Parent says we can be as big as we want. Just don't be larger               * than max size imposed on ourselves.               */               result = desiredSize;               break;              case MeasureSpec.AT_MOST:               /*               * Parent says we can be as big as we want, up to specSize. Don't be               * larger than specSize, and don't be larger than the max size               * imposed on ourselves.               */               result = Math.min(desiredSize, specSize);               break;              case MeasureSpec.EXACTLY:               // No choice. Do what we are told.               result = specSize;               break;           }           return result;       }          private void initVideoView() {           mVideoWidth = 0;           mVideoHeight = 0;           getHolder().addCallback(this);           getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);           setFocusable(true);           setFocusableInTouchMode(true);           requestFocus();       }          public void setVideoPath(String path) {           setVideoURI(Uri.parse(path));       }          public void setVideoURI(Uri uri) {           mUri = uri;           mStartWhenPrepared = false;           mSeekWhenPrepared = 0;           openVideo();           requestLayout();           invalidate();       }          public void stopPlayback() {           if (mMediaPlayer != null) {               mMediaPlayer.stop();               mMediaPlayer.release();               mMediaPlayer = null;           }       }          private void openVideo() {           if (mUri == null || mSurfaceHolder == null) {               // not ready for playback just yet, will try again later               return;           }           // Tell the music playback service to pause           // TODO: these constants need to be published somewhere in the           // framework.           Intent i = new Intent("com.android.music.musicservicecommand");           i.putExtra("command""pause");           mContext.sendBroadcast(i);              if (mMediaPlayer != null) {               mMediaPlayer.reset();               mMediaPlayer.release();               mMediaPlayer = null;           }           try {               mMediaPlayer = new MediaPlayer();               mMediaPlayer.setOnPreparedListener(mPreparedListener);               mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);               mIsPrepared = false;               //Log.v(TAG, "reset duration to -1 in openVideo");               mDuration = -1;               mMediaPlayer.setOnCompletionListener(mCompletionListener);               mMediaPlayer.setOnErrorListener(mErrorListener);               mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);               mCurrentBufferPercentage = 0;               mMediaPlayer.setDataSource(mContext, mUri);               mMediaPlayer.setDisplay(mSurfaceHolder);               mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);               mMediaPlayer.setScreenOnWhilePlaying(true);               mMediaPlayer.prepareAsync();               attachMediaController();           } catch (IOException ex) {               //Log.w(TAG, "Unable to open content: " + mUri, ex);               return;           } catch (IllegalArgumentException ex) {               //Log.w(TAG, "Unable to open content: " + mUri, ex);               return;           }       }          public void setMediaController(MediaController controller) {           if (mMediaController != null) {               mMediaController.hide();           }           mMediaController = controller;           attachMediaController();       }          private void attachMediaController() {           if (mMediaPlayer != null && mMediaController != null) {               mMediaController.setMediaPlayer(this);               View anchorView = this.getParent() instanceof View ? (View) this                       .getParent() : this;               mMediaController.setAnchorView(anchorView);               mMediaController.setEnabled(mIsPrepared);           }       }          MediaPlayer.OnVideoSizeChangedListener mSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() {           public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {               mVideoWidth = mp.getVideoWidth();               mVideoHeight = mp.getVideoHeight();                  if (mMyChangeLinstener != null) {                   mMyChangeLinstener.doMyThings();               }                  if (mVideoWidth != 0 && mVideoHeight != 0) {                   getHolder().setFixedSize(mVideoWidth, mVideoHeight);               }           }       };          MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {           public void onPrepared(MediaPlayer mp) {               // briefly show the mediacontroller               mIsPrepared = true;               if (mOnPreparedListener != null) {                   mOnPreparedListener.onPrepared(mMediaPlayer);               }               if (mMediaController != null) {                   mMediaController.setEnabled(true);               }               mVideoWidth = mp.getVideoWidth();               mVideoHeight = mp.getVideoHeight();               if (mVideoWidth != 0 && mVideoHeight != 0) {                   // Log.i("@@@@", "video size: " + mVideoWidth +"/"+                   // mVideoHeight);                   getHolder().setFixedSize(mVideoWidth, mVideoHeight);                   if (mSurfaceWidth == mVideoWidth                           && mSurfaceHeight == mVideoHeight) {                       // We didn't actually change the size (it was already at the                       // size                       // we need), so we won't get a "surface changed" callback,                       // so                       // start the video here instead of in the callback.                       if (mSeekWhenPrepared != 0) {                           mMediaPlayer.seekTo(mSeekWhenPrepared);                           mSeekWhenPrepared = 0;                       }                       if (mStartWhenPrepared) {                           mMediaPlayer.start();                           mStartWhenPrepared = false;                           if (mMediaController != null) {                               mMediaController.show();                           }                       } else if (!isPlaying()                               && (mSeekWhenPrepared != 0 || getCurrentPosition() > 0)) {                           if (mMediaController != null) {                               // Show the media controls when we're paused into a                               // video and make 'em stick.                               mMediaController.show(0);                           }                       }                   }               } else {                   // We don't know the video size yet, but should start anyway.                   // The video size might be reported to us later.                   if (mSeekWhenPrepared != 0) {                       mMediaPlayer.seekTo(mSeekWhenPrepared);                       mSeekWhenPrepared = 0;                   }                   if (mStartWhenPrepared) {                       mMediaPlayer.start();                       mStartWhenPrepared = false;                   }               }           }       };          private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {           public void onCompletion(MediaPlayer mp) {               if (mMediaController != null) {                   mMediaController.hide();               }               if (mOnCompletionListener != null) {                   mOnCompletionListener.onCompletion(mMediaPlayer);               }           }       };          private MediaPlayer.OnErrorListener mErrorListener = new MediaPlayer.OnErrorListener() {           public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {               //Log.d(TAG, "Error: " + framework_err + "," + impl_err);               if (mMediaController != null) {                   mMediaController.hide();               }                  /* If an error handler has been supplied, use it and finish. */               if (mOnErrorListener != null) {                   if (mOnErrorListener.onError(mMediaPlayer, framework_err,                           impl_err)) {                       return true;                   }               }                  /*               * Otherwise, pop up an error dialog so the user knows that               * something bad has happened. Only try and pop up the dialog if               * we're attached to a window. When we're going away and no longer               * have a window, don't bother showing the user an error.               */               if (getWindowToken() != null) {                      /*                   * if (framework_err ==                   * MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) {                   * messageId = com.android.internal.R.string.                   * VideoView_error_text_invalid_progressive_playback; } else {                   * messageId =                   * com.android.internal.R.string.VideoView_error_text_unknown; }                   *                    * new AlertDialog.Builder(mContext)                   * .setTitle(com.android.internal                   * .R.string.VideoView_error_title) .setMessage(messageId)                   * .setPositiveButton                   * (com.android.internal.R.string.VideoView_error_button, new                   * DialogInterface.OnClickListener() { public void                   * onClick(DialogInterface dialog, int whichButton) { If we get                   * here, there is no onError listener, so at least inform them                   * that the video is over.                   *                    * if (mOnCompletionListener != null) {                   * mOnCompletionListener.onCompletion(mMediaPlayer); } } })                   * .setCancelable(false) .show();                   */               }               return true;           }       };          private MediaPlayer.OnBufferingUpdateListener mBufferingUpdateListener = new MediaPlayer.OnBufferingUpdateListener() {           public void onBufferingUpdate(MediaPlayer mp, int percent) {               mCurrentBufferPercentage = percent;           }       };          /**       * Register a callback to be invoked when the media file is loaded and ready       * to go.       *        * @param l       *            The callback that will be run       */       public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) {           mOnPreparedListener = l;       }          /**       * Register a callback to be invoked when the end of a media file has been       * reached during playback.       *        * @param l       *            The callback that will be run       */       public void setOnCompletionListener(OnCompletionListener l) {           mOnCompletionListener = l;       }          /**       * Register a callback to be invoked when an error occurs during playback or       * setup. If no listener is specified, or if the listener returned false,       * VideoView will inform the user of any errors.       *        * @param l       *            The callback that will be run       */       public void setOnErrorListener(OnErrorListener l) {           mOnErrorListener = l;       }          @Override       public boolean onTouchEvent(MotionEvent ev) {           if (mIsPrepared && mMediaPlayer != null && mMediaController != null) {               toggleMediaControlsVisiblity();           }           return false;       }          @Override       public boolean onTrackballEvent(MotionEvent ev) {           if (mIsPrepared && mMediaPlayer != null && mMediaController != null) {               toggleMediaControlsVisiblity();           }           return false;       }          @Override       public boolean onKeyDown(int keyCode, KeyEvent event) {           if (mIsPrepared && keyCode != KeyEvent.KEYCODE_BACK                   && keyCode != KeyEvent.KEYCODE_VOLUME_UP                   && keyCode != KeyEvent.KEYCODE_VOLUME_DOWN                   && keyCode != KeyEvent.KEYCODE_MENU                   && keyCode != KeyEvent.KEYCODE_CALL                   && keyCode != KeyEvent.KEYCODE_ENDCALL && mMediaPlayer != null                   && mMediaController != null) {               if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK                       || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) {                   if (mMediaPlayer.isPlaying()) {                       pause();                       mMediaController.show();                   } else {                       start();                       mMediaController.hide();                   }                   return true;               } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP                       && mMediaPlayer.isPlaying()) {                   pause();                   mMediaController.show();               } else {                   toggleMediaControlsVisiblity();               }           }              return super.onKeyDown(keyCode, event);       }          private void toggleMediaControlsVisiblity() {           if (mMediaController.isShowing()) {               mMediaController.hide();           } else {               mMediaController.show();           }       }          public void start() {           if (mMediaPlayer != null && mIsPrepared) {               mMediaPlayer.start();               mStartWhenPrepared = false;           } else {               mStartWhenPrepared = true;           }       }          public void pause() {           if (mMediaPlayer != null && mIsPrepared) {               if (mMediaPlayer.isPlaying()) {                   mMediaPlayer.pause();               }           }           mStartWhenPrepared = false;       }          public int getDuration() {           if (mMediaPlayer != null && mIsPrepared) {               if (mDuration > 0) {                   return mDuration;               }               mDuration = mMediaPlayer.getDuration();               return mDuration;           }           mDuration = -1;           return mDuration;       }          public int getCurrentPosition() {           if (mMediaPlayer != null && mIsPrepared) {               return mMediaPlayer.getCurrentPosition();           }           return 0;       }          public void seekTo(int msec) {           if (mMediaPlayer != null && mIsPrepared) {               mMediaPlayer.seekTo(msec);           } else {               mSeekWhenPrepared = msec;           }       }          public boolean isPlaying() {           if (mMediaPlayer != null && mIsPrepared) {               return mMediaPlayer.isPlaying();           }           return false;       }          public int getBufferPercentage() {           if (mMediaPlayer != null) {               return mCurrentBufferPercentage;           }           return 0;       }          public void surfaceChanged(SurfaceHolder holder, int format, int width,               int height) {           mSurfaceWidth = width;           mSurfaceHeight = height;           if (mMediaPlayer != null && mIsPrepared && mVideoWidth == width                   && mVideoHeight == height) {               if (mSeekWhenPrepared != 0) {                   mMediaPlayer.seekTo(mSeekWhenPrepared);                   mSeekWhenPrepared = 0;               }               mMediaPlayer.start();               if (mMediaController != null) {                   mMediaController.show();               }           }       }          public void surfaceCreated(SurfaceHolder holder) {           mSurfaceHolder = holder;           openVideo();       }          public void surfaceDestroyed(SurfaceHolder holder) {           // after we return from this we can't use the surface any more           mSurfaceHolder = null;           if (mMediaController != null)               mMediaController.hide();           if (mMediaPlayer != null) {               mMediaPlayer.reset();               mMediaPlayer.release();               mMediaPlayer = null;           }       }          public boolean canPause() {           // TODO Auto-generated method stub           return false;       }          public boolean canSeekBackward() {           // TODO Auto-generated method stub           return false;       }          public boolean canSeekForward() {           // TODO Auto-generated method stub           return false;       }   }   VedioActivity.java

    [java]  view plain copy package org.cocos2dx.playvideo;       import android.app.Activity;   import android.media.MediaPlayer;   import android.net.Uri;   import android.os.Bundle;   import android.view.Window;   import android.view.WindowManager;         public class VedioActivity extends Activity implements MediaPlayer.OnCompletionListener{       @Override       protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);           //隐藏标题栏           this.requestWindowFeature(Window.FEATURE_NO_TITLE);           //隐藏状态栏           this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);                      //初始化视频View           VideoView view =new VideoView(this);           //设置显示视频View           setContentView(view);           //注册监听视频           view.setOnCompletionListener(this);           //设置视频文件路径           view.setVideoURI(Uri.parse("android.resource://org.cocos2dx.playvideo/" + R.raw.xcm));           //播放视频           view.start();       }          //当视频播放完后回调此函数       @Override       public void onCompletion(MediaPlayer mp) {           //结束当前Activity           this.finish();       }   }   注:在 res下新建一个名为raw的文件夹,将assets下xcm.mp4拷贝到raw文件夹下,否则 :raw 和xcm无法识别!!!

    二.播放网络视频

    IOS项目:

    在RootViewController.h里添加playURLVideo函数 

    并导入头文件#import"MediaPlayer/MediaPlayer.h"

    RootViewController.mm实现playURLVideo函数如下:

    [plain]  view plain copy -(void)playURLVideo   {       NSURL *movieUrl = [NSURL URLWithString:@"http://v.youku.com/player/getRealM3U8/vid/XMzU5NDE3NTYw/type//video.m3u8"];              MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];              [self presentMoviePlayerViewControllerAnimated:player];    }  

    然后修改AppController.mm里的函数

    [plain]  view plain copy -(void)playVideo   {   //   CCSize size = CCDirector::sharedDirector()->getWinSize();   //   [CCVideoPlayer setScrrenSize:CGSizeMake(size.width-400, size.height-300)];   //   [CCVideoPlayer setNoSkip:true];   //   [CCVideoPlayer playMovieWithFile:@"xcm.mp4"];    //播放网络视频        [viewController playURLVideo];    }  

    Android项目:修改playvideo.java

    修改后如下:

    [java]  view plain copy package org.cocos2dx.playvideo;      import org.cocos2dx.lib.Cocos2dxActivity;      import android.net.Uri;   import android.os.Bundle;   import android.content.Intent;         public class playvideo extends Cocos2dxActivity{       //当前类实例       public static playvideo instance;       //用于切换Activity        public static Intent intent;               public void onCreate(Bundle savedInstanceState){           super.onCreate(savedInstanceState);           instance =this;       }       void playURLVideo()       {           Intent intent = new Intent(Intent.ACTION_VIEW);           String type = "video/* ";           Uri uri = Uri.parse("http://forum.ea3w.com/coll_ea3w/attach/2008_10/12237832415.3gp");           intent.setDataAndType(uri, type);           instance.startActivity(intent);         }       static {            System.loadLibrary("game");       }   }  
    转载请注明原文地址: https://ju.6miu.com/read-1304678.html
    最新回复(0)