`
yanghaoli
  • 浏览: 288517 次
社区版块
存档分类
最新评论

cocos2d

 
阅读更多

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

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

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

其原理就是:

MediaPlayer.setDisplay (SurfaceHolder sh)

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
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
        JniMethodInfo t;

        if (JniHelper::getStaticMethodInfo(t, 
            "com/yichou/demo/video/VideoDemo", 
            "playVideo", 
            "(Ljava/lang/String;)V"))
        {
            t.env->CallStaticVoidMethod(t.classID, t.methodID, 
                t.env->NewStringUTF("video2.mp4"));
        }
#endif
  • 2.这样重点还是来到 Java 层:
View Code
    VideoView videoView;
    
    private void a(String name) {
        Log.i("", "name=" + name);
        
//        Uri uri = Uri.parse("file:///android_asset/" + name); //不可取
//        Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.video2); //可取
        videoView = new VideoView(this);
        videoView.setOnFinishListener(this);
//        videoView.setVideo(uri);
        try {
            AssetFileDescriptor afd = getAssets().openFd(name);
            videoView.setVideo(afd);
        } catch (IOException e) {
            e.printStackTrace();
        }
        group.addView(videoView);
        videoView.setZOrderMediaOverlay(true);
    }
    
    public static void playVideo(final String name) {
        if (instance != null) {
            instance.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    instance.a(name); 
                }
            });
        }
    }

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

完整代码:

View Code
 1 public class VideoDemo extends Cocos2dxActivity implements OnFinishListener {
 2     ViewGroup group;
 3     static VideoDemo instance;
 4     
 5 
 6     protected void onCreate(Bundle savedInstanceState){
 7         super.onCreate(savedInstanceState);
 8         instance = this;
 9         
10         group = (ViewGroup)getWindow().getDecorView();
11     }
12     
13     
14     VideoView videoView;
15     
16     private void a(String name) {
17         Log.i("", "name=" + name);
18         
19 //        Uri uri = Uri.parse("file:///android_asset/" + name); //不可取
20 //        Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.video2); //可取
21         videoView = new VideoView(this);
22         videoView.setOnFinishListener(this);
23 //        videoView.setVideo(uri);
24         try {
25             AssetFileDescriptor afd = getAssets().openFd(name);
26             videoView.setVideo(afd);
27         } catch (IOException e) {
28             e.printStackTrace();
29         }
30         group.addView(videoView);
31         videoView.setZOrderMediaOverlay(true);
32     }
33     
34     public static void playVideo(final String name) {
35         if (instance != null) {
36             instance.runOnUiThread(new Runnable() {
37                 @Override
38                 public void run() {
39                     instance.a(name); 
40                 }
41             });
42         }
43     }
44     
45     static {
46          System.loadLibrary("game");
47     }
48 
49     @Override
50     public void onVideoFinish() {
51         group.removeView(videoView);
52         videoView = null;
53     }
54 }

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

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

3
1
分享到:
评论

相关推荐

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    cocos2d-x-cocos2d-x-2.2.2.zip

    这个压缩包“cocos2d-x-cocos2d-x-2.2.2.zip”包含了cocos2d-x 的2.2.2版本,该版本是cocos2d-x发展中的一个重要里程碑,它提供了许多改进和优化,使得开发者能够更加高效地创建2D游戏和应用。 在cocos2d-x 2.2.2中...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...

    cocos2d-x 3.0

    《cocos2d-x 3.0:游戏开发中的角色移动技术详解》 在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更...

    Cocos2d-JS游戏开发

    Cocos2d-JS是一款强大的2D游戏开发框架,它结合了JavaScript的灵活性与Cocos2d-x的高效性能,让开发者能够轻松地创建跨平台的游戏。本篇将深入探讨Cocos2d-JS的游戏开发知识,从基础到进阶,帮助你掌握这一利器。 ...

    cocos2d-android jar包全套.zip

    Cocos2d是一款开源的游戏开发框架,被广泛用于创建2D游戏、演示程序和其他互动内容。在Android平台上,Cocos2d-x是一个基于C++的版本,提供了原生的编程接口,同时也支持Java API,方便Android开发者使用。"cocos2d-...

    Cocos2d-x实战C++卷关东升著完整版pdf

    《Cocos2d-x实战C++卷》是关东升所著的一本深入探讨Cocos2d-x游戏引擎开发的专业书籍。Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言为主要编程...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    《cocos2d-x 3.8:经典游戏引擎源码解析》 cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形交互应用。这...

    cocos2d-x windows vs2010配置

    "cocos2d-x windows vs2010 配置详解" 本文将详细介绍如何在 Windows 环境下使用 Visual Studio 2010 配置 Cocos2d-x 游戏引擎。Cocos2d-x 是一个跨平台的游戏引擎,可以在多种平台上运行,包括 Windows、Mac OS X...

    cocos2d-android.jar.zip_CoCos2d_android jar_android game_cocos2d

    cocos2d-android游戏引擎是著名游戏引擎cocos2d游戏引擎的Android版。cocos2d-android游戏引擎性能优越、易学、可以进行纯java编程、具有极高的研 究价值、大大的降低了开发者的学习成本。您只需要一台普通配置的...

    Cocos2d-x实战:C++卷(2版)源代码

    《Cocos2d-x实战:C++卷(2版)源代码》这本书是关于使用Cocos2d-x游戏引擎进行游戏开发的专业指南。Cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言...

    Cocos2d-x 3.x游戏开发实战pdf含目录

    《Cocos2d-x 3.x游戏开发实战》是一本深度探讨Cocos2d-x 3.x框架的游戏开发书籍,适合对游戏编程有兴趣的开发者学习。Cocos2d-x 是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多平台的...

    Cocos2d-x实战 JS卷

    《Cocos2d-x实战 JS卷》是一本深入探讨Cocos2d-x游戏开发的专著,主要聚焦于使用JavaScript语言进行游戏编程。Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动设备和桌面平台,支持iOS、Android、Windows等多...

    cocos2d-x_v3.16安装及环境变量配置文档

    cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...

    cocos2d-x-3.1.zip

    Cocos2d-x是一个开源的游戏开发框架,广泛用于2D游戏、实时渲染应用程序和其他互动内容的制作。这个压缩包“cocos2d-x-3.1.zip”包含了Cocos2d-x框架的3.1版本,这是一个经典且相对旧的版本,可能对于那些寻找历史...

    cocos2d-x-3.13.1 spine3.6.zip

    《Cocos2d-x 3.13.1与Spine 3.6集成详解》 Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,...

    Cocos2d-html5

    Cocos2d-html5是一个基于Web的开源游戏开发框架,专为创建2D游戏、交互式应用程序和动画而设计。这个框架充分利用了HTML5、CSS3和JavaScript等现代Web技术,使得开发者能够在浏览器环境中构建高性能的游戏应用。...

    cocos2d-x API中文文档

    【cocos2d-x API中文文档】是一份详尽的资料,主要涵盖了cocos2d-x游戏引擎的API,这份文档适用于2015年的最新版本。cocos2d-x是一个基于MIT许可证的开源游戏引擎,它以快速、简单且功能强大的特性闻名,允许开发者...

    cocos2d-iphone-2.0.tar.gz

    Cocos2d-iPhone是一个广泛使用的2D游戏开发框架,专为iOS设备(如iPhone和iPad)设计。这个开源项目让开发者能够轻松地创建高质量的游戏、应用和交互式内容,而无需深入理解底层图形和物理编程。"cocos2d-iphone-2.0...

    Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整

    标题中提到了"Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整",这里面包含了几个关键知识点: 1. Cocos2d-x:是一个开源的游戏开发框架,它主要用于开发跨平台的游戏和应用程序,支持iOS、...

Global site tag (gtag.js) - Google Analytics