Android中利用OpenMax 编程的基本流程
近期因为公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,但是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播放器硬解码的开发能起到点作用。因为对视频也不了解,所以难免有不少错误,欢迎高手指导。
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 编程的基本流程的更多相关文章
- Android中利用Handler实现消息的分发机制(三)
在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而假设在子线程中须要去 ...
- Android中利用ant进行多渠道循环批量打包
公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android ...
- Android中的多线程编程(一)附源代码
Android中多线程编程:Handler类.Runnable类.Thread类之概念分析 1.Handler类: Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理.Handl ...
- Android中利用C++处理Bitmap对象
相信有些Android&图像算法开发者和我一样,遇到过这样的状况:要对Bitmap对象做一些密集计算(例如逐像素的滤波),但是在java层写循环代码来逐像素操作明显是不现实的,因为Java代码 ...
- Android中利用jsoup解析html页面
学习jsoup :jsoup学习网站 Android 中使用: 添加依赖 implementation 'org.jsoup:jsoup:1.10.1' 直接上代码: package com.load ...
- Android中利用Camera与Matrix实现3D效果详解
本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...
- Android中的多线程编程
问题 Android的UI也是线程不安全的,如果要更新应用程序里的UI元素,必须在主线程中进行,否则就会抛异常.比如用一个Button的onClick函数去更新界面上的元素,就会得到一个CalledF ...
- Android中利用ViewHolder优化自定义Adapter的典型写法
利用ViewHolder优化自定义Adapter的典型写法 最近写Adapter写得多了,慢慢就熟悉了. 用ViewHolder,主要是进行一些性能优化,减少一些不必要的重复操作.(WXD同学教我的. ...
- android中利用实现二级联动的效果
按照惯例,首先上一张效果图. 本篇文章实现的效果就是如图中所圈的那样,实现类似于HTML中的二级联动的效果. 对于第一个选项我们读取的是本地xml文件来填充数据的, 对于第二个选项我们读取的是通过中央 ...
随机推荐
- after I see Little Dorrit
也许是我太追名逐利,所以我不肯承认自己花费了大把的时间看电影,通过写博客好像自己从中感悟到了什么,好像看电影也是一种学习的方式. 也许是我平静自内心的方式,我太忙于玩或者学习,甚至没有机会非常沉静 一 ...
- 致命错误: Python.h:没有那个文件或目录
In file included from greenlet.c:5:0: greenlet.h:8:20: 致命错误: Python.h:没有那个文件或目录 编译中断. error: Setup s ...
- matlab中 hold on 与hold off的用法
matlab中 hold on 与hold off的用法 hold on 是当前轴及图形保持而不被刷新,准备接受此后将绘制 hold off 使当前轴及图形不在具备被刷新的性质 hold on 和ho ...
- zigbee智能家居基础扫盲
zigbee Zigbee是基于IEEE802.15.4标准的低功耗个域网协议.根据这个协议规定的技术是一种短距离.低功耗的无线通信技术.这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和&qu ...
- Android LogCat 日志记录
日志级别列表如下(从低到高): V — Verbose (lowest priority) D — Debug I — Info W — Warning E — Error F — Fatal S — ...
- 查看Mac OSX机器上存在的所有Device
可以使用instruments -s来查看Mac OSX机器上存在的所有Device,包括模拟器创建的Device以及真实连接的iPad,iPhone等设备.
- 李洪强iOS开发Swift篇—04_运算符
李洪强iOS开发Swift篇—04_运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运 ...
- 消息队列feed程序实现中的问题
因项目需要, 构建了很多消息队列还排队处理任务, 相应的每个队列也配有一个feed程序来feed消息 一开始很简单地这样做: while (true){ $msg = $query->bPop( ...
- WPF WebBroswer可以用到的接口
http://pinvoke.net/default.aspx/Interfaces.DWebBrowserEvents2 [ComImport, SuppressUnmanagedCodeSecur ...
- hadoop2.2编程:序列化
测试序列化后的长度 提示:需要用到的类,以及继承关系如下: 1.java.lang.Object |__ java.io.OutputStream |__ java.io.ByteArrayOutpu ...