近期因为公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,但是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播放器硬解码的开发能起到点作用。因为对视频也不了解,所以难免有不少错误,欢迎高手指导。

1: 由文件或者设备来创建一个dataSource(DataSource) (当中能够是文件描写叙述符fd, uri ,http)

2:  通过dataSource来创建一个MediaExtractor(即视频的分流器paser)实例

3:  由 MediaExtractor实例来创建两个MediaSource(视频要包括两个, 一个为视频mVideoTrack, 一个为音频 mAudioTrack), 当中就重要的是read函数用于解码器获得原始视频数 据  进行解码

4:  创建一个OMXClient实例并连接(详细调用其connect()方法,并检查是否成功返回)

5:  创建对应的解码器实例 比如:

 mOmxSource = OMXCodec::Create(                                                                                                                                

   mClient.interface(), mAudioTrack->getFormat(),

   false, // createEncoder

   mAudioTrack);

mVideoSource = OMXCodec::Create(

  mClient.interface(), mVideoTrack->getFormat(),

  false, // createEncoder

  mVideoTrack,   

  NULL, flags,

  mNativeWindow);   

 mAudioTrack mVideoTrack 即为两个MediaSource实例 分别代表原始的数据源

 注意这两个都返回了一个MediaSource的实例(mOmxSource and mVideoSource),这两个是用于用户获得解码后的音视频数据并进行播放使用的

mNativeWindow(ANativeWindow) 为上层Surface的下层体现,即上层要用于显示的Surface

创建 ANativeWindow 的方法:

 1:  从JAVA层会通过JNI传递一个JSurface的对象到JNI, 而JNI能够通过这个对象来获取IGraphicBufferProducer, 方法为:

   sp<Surface> surface;   

   sp<IGraphicBufferProducer> gbp;

   if (jSurface) {        

    surface = android_view_Surface_getSurface(env, jSurface);

    if (surface != NULL) {

     gbp = surface->getIGraphicBufferProducer();

    }                  

   }                      

  终于得到 一个 IGraphicBufferProducer 的 实例 gbp

 2: 上层提供一个 sp<IGraphicBufferProducer> &bufferProducer 的一个引用并能够用来创建ANativeWindow mNativeWindow = new Surface(bufferProducer)  //些处參考AwesomePlayer.cpp

6: 调用5返回来的两个MediaSource实例的read方法(主要是用于获取一个MediaBuffer的实例 mVideoBuffer)来获取解码后的数据(即在MediaBuffer中)并进行对应处理(即进行播放)

7: 通过ANativeWindow来显示图像

    status_t err = mNativeWindow->queueBuffer(mNativeWindow.get(), mVideoBuffer->graphicBuffer().get(), -1);

    sp<MetaData> metaData = mVideoBuffer->meta_data();

    metaData->setInt32(kKeyRendered, 1);   //主要设置一个渲染标记,说明已经显示 (猜得)

Android中利用OpenMax 编程的基本流程的更多相关文章

  1. Android中利用Handler实现消息的分发机制(三)

    在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而假设在子线程中须要去 ...

  2. Android中利用ant进行多渠道循环批量打包

    公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android ...

  3. Android中的多线程编程(一)附源代码

    Android中多线程编程:Handler类.Runnable类.Thread类之概念分析 1.Handler类: Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理.Handl ...

  4. Android中利用C++处理Bitmap对象

    相信有些Android&图像算法开发者和我一样,遇到过这样的状况:要对Bitmap对象做一些密集计算(例如逐像素的滤波),但是在java层写循环代码来逐像素操作明显是不现实的,因为Java代码 ...

  5. Android中利用jsoup解析html页面

    学习jsoup :jsoup学习网站 Android 中使用: 添加依赖 implementation 'org.jsoup:jsoup:1.10.1' 直接上代码: package com.load ...

  6. Android中利用Camera与Matrix实现3D效果详解

    本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...

  7. Android中的多线程编程

    问题 Android的UI也是线程不安全的,如果要更新应用程序里的UI元素,必须在主线程中进行,否则就会抛异常.比如用一个Button的onClick函数去更新界面上的元素,就会得到一个CalledF ...

  8. Android中利用ViewHolder优化自定义Adapter的典型写法

    利用ViewHolder优化自定义Adapter的典型写法 最近写Adapter写得多了,慢慢就熟悉了. 用ViewHolder,主要是进行一些性能优化,减少一些不必要的重复操作.(WXD同学教我的. ...

  9. android中利用实现二级联动的效果

    按照惯例,首先上一张效果图. 本篇文章实现的效果就是如图中所圈的那样,实现类似于HTML中的二级联动的效果. 对于第一个选项我们读取的是本地xml文件来填充数据的, 对于第二个选项我们读取的是通过中央 ...

随机推荐

  1. MVC5框架解析之Controller的创建

    在上一讲中我们介绍了MvcHandler,知道在Handler里面注入两个接口属性分别为IControllerFactory和IController的factory和controller.并且通过IO ...

  2. jquery.inputmask.js 输入框input输入内容格式限制插件

    今天使用的就是这几行代码. 利用 jquery.inputmask.js  下载地址(如果打不开的话 请FQ http://plugins.jquery.com/jquery.inputmask/) ...

  3. leetcode第八题 String to Integer (atoi) (java)

    String to Integer (atoi) time=272ms   accepted 需考虑各种可能出现的情况 public class Solution { public int atoi( ...

  4. NOI冲刺计划

    省选过了,剩下大概是NOI冲刺了吧.中间还有一大堆诸如会考,CTSC,APIO等东西. 最近先不急着天天刷八中了吧,多在不同网站见一些题,然后再着重提高一下代码准确性.重点把DP这个板块多练习一下,八 ...

  5. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥

    1914: [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 272  Sol ...

  6. UVA 10034 Freckles 最小生成树

    虽然是道普通的最小生成树题目,可还是中间出了不少问题,暴露的一个问题是不够细心,不够熟练.所以这篇博客就当记录一下bug吧. 代码一:kruskal #include<stdio.h> # ...

  7. VS2005 检测内存泄漏的方法(转载)

    一.非MFC程序可以用以下方法检测内存泄露: 1.程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __F ...

  8. android Button 颜色的变化(点击,放开,点击不放)

    参考: http://endual.iteye.com/blog/1534258 总结: 定义res/drawable/button_style.xml文件 <?xml version=&quo ...

  9. Phpwind v9.0 存储型xss跨站漏洞

    漏洞版本: Phpwind v9.0 漏洞描述: Phpwind专注于中小网站应用的整合和价值的发掘,我们认为,以社区为网站的基础,可以提供丰富的应用,满足人们获取信息.交流.娱乐.消费等生活需求.获 ...

  10. Mac 下配置XAMPP

    1:去官方下载 2:安装dmg 3:安装完成后, 网页上提示, 要设置相应的密码, 设置完成. 4:打开对应的app程序, 把 mysql Database运行起来, 不然, 网页上看到的就是未运行状 ...