应一个朋友需求,研究了下 cocos2d-x 引擎在 android 平台上播放视频的方法,因为之前研究 Libgdx 播视频的时候有了经验,于是依葫芦画瓢

首先你不要想到去用系统的 VideoView 控件,他不适合我们

我们来用强大 SurfaceView 和 MediaPlayer 来组装一下,android 框架设计的很好啊

其原理就是:

MediaPlayer.setDisplay(SurfaceHoldersh)

sh 来自于SurfaceView,这样MediaPlayer就可以看到画面了。

不过这里面有几个细节需要注意:

  • 1.何时调用setDisplay :

  一般可能会在构造函数里面就调用,这样系统会报错即使没报错也可能会出现 闻其声而不见其画面 的现象(大多数人遇到过),告诉你 Holder 无效,SurfaceHolder是有一组回调接口的,通过

  addCallback(SurfaceHolder.Callback callback)

设置,Callback 里面有个函数:

  surfaceCreated(final SurfaceHolder holder)

其参数是SurfaceHolder 所以我们可以猜到这个接口用来告诉我们SurfaceHolder 创建好啦,所以我们在这个回调里面调用MediaPlayer.setDisplay 就没问题啦!

  • 2.如何播放视频文件:

在 coco2d-x 中,资源文件肯定都在 assets 目录下,所以我们首先想到通过 URI 引用 assets 下文件,Like:

Uri uri = Uri.parse("file:///android_asset/" + name); //不可取

但是这样是不行的,播放不出来,于是我就上 StackOverFlow 上搜搜,还是有前辈解决了,所以我要说一句:StackOverFlow 是一个神奇的网站。

正确的做法是调用这个接口:

setDataSource (FileDescriptor fd, long offset, long length)

assets 下可以通过:AssetFileDescriptor afd = getAssets().openFd(name); 方法得到AssetFileDescriptor 对象,然后这样调用就OK:

mPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());

你可能会想到:

//直接调用 fd.getFileDescriptor() 是不行的mPlayer.setDataSource(fd.getFileDescriptor());

这样也是不行的,具体原因没深入研究,此外再介绍用 res/raw 下资源的方法:

Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.video2); //可取

这样一个 android 层视频播放器就封装好了,实现细节可以看源代码:

View Code

下面介绍如何调用这个播放器:

  • 1.native 层:native 调 java 我们肯定要用到 jni 技术,cocos2d-x 封装了一个 jni 帮助类在:cocos2dx\platform\android\jni\JniHelper.h ,我们需要在 Java 层定义一个静态方法,然后通过 jni->CallStaticVoidMethod 调用:
View Code
  • 2.这样重点还是来到 Java 层:
View Code

为了方便起见,我们把方法定义为 static 这样我们就需要一个当前 activity 的实例,这里用了一个 instance 静态全局变量,类似于单例设计模式。

完整代码:

View Code

OK,核心方法介绍完毕,具体实现细节可以看我提供的 Demo 源码

http://pan.baidu.com/share/link?shareid=505934&uk=4061068395

更多相关文章

  1. Android跨进程通信IPC之19——AIDL
  2. android 垂直 SeekBar 源代码(VerticalSeekBar)
  3. Android(安卓)不得不知Tag的妙用
  4. Android中捕捉menu按键点击事件的方法
  5. 多个Activity跳转的小结
  6. Android中 网络框架Volley的用法
  7. Android绘制流程窗口启动流程分析(上)
  8. Android实现在列表List中显示半透明小窗体效果的控件用法详解
  9. Android(安卓)DownloadManager 的使用

随机推荐

  1. android studio 修改jdk默认编译版本
  2. Android 安卓 案例
  3. Android ProgressBar简单使用
  4. android ListView性能优化提示
  5. FFmpeg In Android - tutorial-4-Spawnin
  6. android 配置文件
  7. Android中倒计时代码
  8. Android上多个应用不能同时调用AudioReco
  9. Android-画背景
  10. 《Android 基础(三十三)》 TabHost ~ 仿微