OpenCore介绍

2023-05-16

一、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》
     
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

    OpenCore介绍 的相关文章

    • STM32学习心得(第二天)

      我感觉今天的学习状态还是可以的 xff0c 进行了开发环境的搭载和怎样构建一个新项目 基于固件库 xff0c 学到了较多的新知识 xff0c 同时了解了STM32的启动模式 xff0c 程序下载的两种方法 xff08 1 ISP串口下载2
    • STM32学习心得(第三天)

      今天的状态还可以 xff0c 学习了新建工程模板 xff08 基于寄存器 xff09 和了解了GPIO工作原理 xff0c 昨天基于库函数新建工程模板学习的并不牢固 xff0c 今天还是无法自己创建出来 xff0c 正好借此机会再巩固一下
    • Ubuntu 快速更换阿里源

      简介 xff1a 本文主要给大家讲解如何为Ubuntu更换阿里源 xff0c 通过以下四个步骤即可快速实现换源 镜像下载 域名解析 时间同步请点击 阿里巴巴开源镜像站 一 查看ubuntu的Codename lsb release a gr
    • 【工作遇到的问题——已解决】pip3 install numpy失败

      问题描述 需求 xff1a 求出列表中90 的响应时间 xff1a import numpy as np span class token keyword for span i in finalvalues span class token
    • 7、CAS

      目录 1 CAS是什么 1 1 CAS基本知识 1 2 CAS基本思想 2 对原子类中使用的CAS进行分析 2 1 CAS demo 代码 2 2 源码分析 3 原子类 3 1 有那些属性 用AtomicInteger分析 3 2 Unsa
    • ubuntu设置网络代理在内网中使用 apt代理、docker代理

      ubuntu设置apt 代理 编辑apt 配置文件 span class token function sudo span span class token function vim span etc apt apt conf 添加以下内容
    • 通过VNC远程连接ubuntu桌面(多种客户端连接方式)

      背景 有些时候一些设备不带显示器和键盘鼠标 xff0c 我们来维护他 xff0c 是通过ssh远程连接进行操作 但可能有些维护需要有图形显示来操作 xff0c 这时候再用ssh就不是很合适了 我所遇的设备情况是 xff0c 经常要自己接入显
    • 选择悖论:开源网络操作系统(NOS)重启指南

      我们拥有的选择越多 xff0c 就越不满足 然而 xff0c 只有手握选择权 xff0c 才能在决策之时享受自由和自主 这就是众所周知的选择悖论 当你打算从亨氏旗下的57种薯片 xff08 我的美国朋友们把它叫做chips xff09 中挑

    随机推荐

    • Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering

      一 摘要 自下而上的机制 基于 Faster R CNN xff1a 提取出图像区域 xff0c 每个区域都有一个相关的特征向量 自上而下的机制 xff1a 确定特征权重 提出了一种自下而上和自上而下的结合注意力机制 xff0c 使注意力能
    • 在keras环境下将numpy数据形式转换为tensor

      目录 前期尝试试错最终的解决方法 前期尝试 因为刚刚开始学习 xff0c 想要记录一下自己学习的全过程 xff0c 所以想知道具体方法的可以直接在目录跳到最后 xff1a 最终的解决方法 最近开始接触神经网络的学习 xff0c 在看过一个比
    • SSH测试远程服务器端口的连通性

      ssh是linux的标准配置并且最常用 xff0c 可以用来判断端口是否打开 用法 ssh v p port username 64 ip v 详细模式 会打印日志 xff0c 显示登录的细节 p 指定端口 username 可以随意 ip
    • hadoop单表关联

      1 单表关联 实例描述 实例中给出child parent xff08 孩子 父母 xff09 表 xff0c 要求输出grandchild grandparent xff08 孙子 爷奶 xff09 表 样例输入 如下所示 file xf
    • 调试带有源码的dll

      环境 windows 7 Visual Studio 2010 将dll项目debug目录下的 dll lib pdb文件拷贝到exe项目程序的debug目录下 xff08 是exe所在的文件夹 xff09 在调用dll里面的函数前面增加断
    • 遍地开花的 Attention ,你真的懂吗?

      阿里妹导读 xff1a 曾被 paper 中各种各样的 Attentioin 搞得晕晕乎乎 xff0c 尽管零零散散地整理过一些关于Attention 的笔记 xff0c 重点和线索依然比较凌乱 今天 xff0c 阿里巴巴工程师楠易 xff
    • Javaweb期末复习大纲

      20 21 2022 学年第 1 学期考试复习纲要 题型 xff1a 一 单项选择题 二 多选题 三 判断题 四 填空题 五 简答题 六 补充程序 重点复习章节及知识点 xff1a 第3章重点记忆归纳 xff1a xff08 题目分布 xf
    • Python 装饰器的三种用法及使用示例

      文章目录 前言装饰器三种用法包括 xff1a 不带参数的装饰器 带参数的装饰器 创建装饰器类 总结 前言 装饰器的作用主要是在不影响函数逻辑的情况下 xff0c 扩展其某个常用功能 xff0c 常用于为函数添加事件记录 例如当需要给创建的所
    • pip3在Ubuntu下的安装、升级、卸载

      参考资料 pip 常用命令 pip 官方文档 一 常用命令 1 在线安装 gt gt sudo apt get install python3 pip 1 1 离线安装 下载get pip py脚本 wget https bootstrap
    • 光立方原理图理解

      原文链接 xff08 点击原文链接获取更多学习干货 xff09 xff1a http blog bools cn archives 850 光立方原理图理解 一 淘宝提供的原理图版本1版本2我AD画的原理图一点点小技巧 xff1a 我不知道
    • 三种常用的LED驱动电源电路图详解

      时间 xff1a 2017 07 10 15 30 43 关键字 xff1a LED电路 led驱动电源 led电源电路图 LED电源有很多种类 xff0c 各类电源的质量 价格差异非常大 xff0c 这也是影响产品质量及价格的重要因素之一
    • haar+adaboost结合讲解(偏重实际)

      这是一篇之前总结的文档 xff0c 大部分来源于csdn和文献 xff0c 如有未标明引用 xff0c 请联系我加上 目录 1 Haar特征和积分图 1 1 Haar特征的生成 1 2 计算Haar特征值 1 3 Haar特征值归一化 1
    • 【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程

      ROS安装指南 目录 ROS安装指南 前言 一 配置Linux清华镜像源1 1 介绍1 2 开始配置 二 安装ROS2 1 ROS的介绍2 1 开始安装 xff1a 配置公钥2 2 系统更新2 3 安装ROS 三 配置ROS3 1 初始化r
    • Python2.7安装教程

      Python安装教程 1 下载安装包 链接 xff1a https www python org downloads release python 2712 根据自己的系统选择对应的版本 注意 必须在全英文路径下安装 2 双击下载的安装程序
    • CMake+QT使用教程

      一 CMake入门 下面是使用 Qt 用 C 43 43 编写的控制台应用程序的典型文件 xff1a CMakeLists txt 1 构建一个控制台应用程序 span class token comment 指定应用程序所需的CMake最
    • Ubuntu18.04修改file descriptors(文件描述符限制),解决elasticsearch启动报错问题

      最近在学习elasticsearch xff0c 使用的平台是Ubuntu18 04 xff0c 在部署过程中的坑记录一下 下载安装的过程就不说了 xff0c 在启动es的时候报错 max file descriptors 65535 fo
    • 场景文本识别应用自然语言处理的方法综述(2021年)

      诸神缄默不语 个人CSDN博文目录 本文是场景文本识别领域应用自然语言处理方法的前沿技术综述 改自作者2021年末交的工程前沿技术讲座课程大作业 xff08 另一门课程计算机视觉的大作业也是在此文基础上改进的 xff09 xff08 看作者
    • linux下安装node和npm

      linux下安装node和npm 1 打开linux的命令窗口 xff0c 进入根目录 cd 2 使用wget命令下载node包 注 xff1a 这里作者下载的是16 14版本的node xff0c 如果有需要可以直接更换制定版本的node
    • Xcode 升级后,常常遇到的遇到的错误解决方法

      1 xff0c 错误信息 xff1a 34 OBJC CLASS xxxxx 34 referenced from objc class ref in ViewController o ld symbol s not found for a
    • OpenCore介绍

      一 OpenCore简介 OpenCore是Android的多媒体核心 xff0c 采用C 43 43 实现 xff0c 定义了全功能的操作系统移植层 xff08 OSCL xff09 xff0c 各种基本的功能均被封装成类的形式 xff0