Android中利用OpenMax 编程的基本流程

转载自:

https://www.2cto.com/kf/201407/313909.html

 

 

 

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

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;
sp gbp;
if (jSurface) {
surface = android_view_Surface_getSurface(env, jSurface);
if (surface != NULL) {
gbp = surface->getIGraphicBufferProducer();
}
}
最终得到 一个 IGraphicBufferProducer 的 实例 gbp
2: 上层提供一个 sp &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 = mVideoBuffer->meta_data();
metaData->setInt32(kKeyRendered, 1); //主要设置一个渲染标记,说明已经显示 (猜得)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值