OpenCore介绍

一、OpenCore简介

        OpenCore是Android的多媒体核心,采用C++实现,定义了全功能的操作系统移植层(OSCL),各种基本的功能均被封装成类的形式,各层次之间的接口多使用继承等方式。
        从宏观上来看,它主要包含了两大方面的内容:
  1. PVPlayer:提供媒体播放器的功能,完成各种音频(Audio)、视频(Video)流的回放(Playback)功能。
  2. PVAuthor:提供媒体流记录的功能,完成各种音频(Audio)、视频(Video)流的以及静态图像捕获功能 。

    二、OpenCore在Android系统中的位置

            首先来一张抽象一点的图(如下):

            从上图我们可以感觉到OpenCore封装了一些接口给应用程序。具体是什么呢?下面以音频/视频播放器为例,看看具体的过程:

             其中, 
    1.  
      1. VideoView.java 是一个media集成的高层的JAVA类,这个类的文件在/frameworks/base/core/java/android/widget/。它集成了MediaPlayer和SurfaceView的类,可以作为一个UI元素(View)直接放在界面中,用于视频的播放。
      2. MediaPlayer.java和MediaRecorder.java 为基本的处理音频数据的Java类,它里面直接调用很多本地接口。
      3. android_media_MediaPlayer.cppandroid_media_MediaRecorder.cpp 封装了相应的JNI接口。

    三、多媒体播放的过程

            视频文件(流)播放过程就像一个状态机。图形如下,其中椭圆形代表MediaPlayer类的状态;线代表状态变化,由源状态指向目标状态,它旁边标注有状态变化的条件,其中单箭头的线表示同步(synchronous)方法调用,双箭头表示异步(asynchronous)方法调用。
    这幅状态运行图显示了视频播放时的各种状态之间的切换方法,除此之外,为了方便用户处理,在一些状态下,系统会调用回调函数,只要用户提前注册好相应的回调函数即可。
    状态
    回调函数
    注册方法
    Error
    OnErrorListener.onError() 
    setOnErrorListener(android.media.MediaPlayer.OnErrorListener)
    Prepared
    OnPreparedListener.onPrepared()
    setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)
    Started
    OnBufferingUpdateListener.onBufferingUpdate()setOnBufferingUpdateListener(OnBufferingUpdateListener)
    使用seekTo(int)后
    OnSeekComplete.onSeekComplete()
    setOnSeekCompleteListener(OnSeekCompleteListener)
    PlaybackCompleted
    OnCompletionListener.onCompletion()
    setOnCompletionListener(OnCompletionListener)
     

    四、OpenCore内部的重要概念

       OSCL :Operating System Compatibility Library (操作系统兼容库),包含了一些操作系统底层的操作,为了更好地在不同操作系统移植。包含了基本数据类型、配置、字符串工具、IO、错误处理、线程等内容,类似一个基础的C++库。
       PVMF :PacketVideo Multimedia Framework(PV多媒体框架),在框架内实现一个 文件解析(parser)组成(composer)编解码NODE ,也可以继承其通用的接口,在用户层实现一些NODE。
     

    五、OpenCore的内部调度过程

            PlayerDriver创建后进入 OSCL 线程来处理消息, engine 创建完各个 node 节点并将其连接起来,剩下的就是node间的通讯问题,各node状态变化会触发oscl对其下一次调度,参与到oscl调度中的模块都必须提供一个 Run函数 ,oscl会去call这个函数。
            内部流程图如下:

           文件的播放过程如下:
    1.  
      1. 判断源文件的格式,根据文件格式创建对应的文件解析节点ParseNode :  PVPlayerRecognizerRegistry负责文件格式识别,并将结果返回给PVPlayerEngine;
      2. 通过文件解析节点(ParseNode)来完成音视频文件格式的解析,并将文件中的音频、视频数据送到对应的解码节点进行解码;
      3. 解码节点(DecNode)通过调用底层的opencoreMAX 通用接口实现媒体数据的解码;对于一个普通的视频文件,存在2个解码节点:音频解码节点视频解码节点

    六、解码的内部流程:

            参考OpenMax 的相关介绍。
     

    七、Android上的视频输出方案

            为了使opencore的视频播放支持Android系统,谷歌定义了两套视频输出方案,一种是由硬件 厂商实现硬件加速的视频输出( libopencorehw.so ),硬件视频输出里面可以调用硬件Overlay模块对输出的视频数据进行硬件混叠,这样输出效率会非常的高;另外一种为谷歌定义的软视频输出,该软视频输出定义为 AndroidSurfaceOutput 类,这种方案中系统会调用SurfaceFilnger对输出视频数据进行混叠,该混叠为软件混叠,执行效率比较低。
     

    八、OpenCore的测试方式

    参考《Build OpenCORE 2.05 on x86 Linux .PDF》和《pvplayer_engine_unit_test_guide.pdf》
     

    • 1
      点赞
    • 9
      收藏
      觉得还不错? 一键收藏
    • 1
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值