cocos2d-x 播放视频 on Android
应一个朋友需求,研究了下 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 调用:
- 2.这样重点还是来到 Java 层:
为了方便起见,我们把方法定义为 static 这样我们就需要一个当前 activity 的实例,这里用了一个 instance 静态全局变量,类似于单例设计模式。
完整代码:
View CodeOK,核心方法介绍完毕,具体实现细节可以看我提供的 Demo 源码
http://pan.baidu.com/share/link?shareid=505934&uk=4061068395
更多相关文章
- Android跨进程通信IPC之19——AIDL
- android 垂直 SeekBar 源代码(VerticalSeekBar)
- Android(安卓)不得不知Tag的妙用
- Android中捕捉menu按键点击事件的方法
- 多个Activity跳转的小结
- Android中 网络框架Volley的用法
- Android绘制流程窗口启动流程分析(上)
- Android实现在列表List中显示半透明小窗体效果的控件用法详解
- Android(安卓)DownloadManager 的使用