• 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);   //主要设置一个渲染标记,说明已经显示 (猜得)

     

  • 相关阅读:
    socket:套接字
    hashlib 加密
    面向对象总结
    类的内置方法
    反射
    类中的三个装饰器方法
    text
    模块
    练习1
    内置函数
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3878036.html
Copyright © 2020-2023  润新知