当前位置: 首页 > news >正文

珠海网站系统建设长沙网站seo收费

珠海网站系统建设,长沙网站seo收费,中企动力网站建设,网站模板用什么软件做文章目录 前言android 原生的应用srcreenrecordMediaCodec获取编码数据流程 前言 本篇文章主要是理解Android 12编码的流程, 首先从上层的应用出发理解mediacodec提供给外部API的用法。然后针对每个api 分析编码各个流程中框架中的流程。 熟悉一个框架的流程 可以…

文章目录

      • 前言
      • android 原生的应用srcreenrecord
      • MediaCodec获取编码数据流程

前言

本篇文章主要是理解Android 12编码的流程, 首先从上层的应用出发理解mediacodec提供给外部API的用法。然后针对每个api 分析编码各个流程中框架中的流程。

熟悉一个框架的流程 可以从简单到复杂、从整体到局部去展开。 同时在理解过中会产生各种各样的问题,各种问题的解决就是一个知识经验的形成过程。

android 原生的应用srcreenrecord

  • 应用和代码路径

代码路径:frameworks\av\cmds\screenrecord\screenrecord.cpp

编译生成的是screenrecord在system/bin目录,默认在android系统都会携带。

使用命令:这个命令会将屏幕的操作录制到/sdcard/test.mp4下。

 screenrecord /sdcard/test.mp4
  • 应用流程

    • 首先在编码器mediacodec调用createInputSurface创建一个inputSurface。这个inputSurface传递出来到显示 作为虚拟显示的bufferProducer。
    • 在surfaceFlinger 端,inputSurface作为prepareVirtualDisplay的参数, 使得surfaceFlinger从这个surface中获取bufffer, 然后将屏幕合成后的数据写到这个buffer里面。
    • 在编码端将这个buffer 作为编码的输入进行处理。mediacodec编码完成之后调用dequeueOutputBuffer 将编码之后的数据取出来写到文件,然后调用releaseOutputBuffer将这个buffer释放回去。
    • 在编码器这边,surfaceflinger 是生产端,mediacodec是消费端。其他有关屏幕录制或者surface 直接到编码的流程大概都是这样的。
    创建编码器,创建输入的surface,配置format,启动编码器
    sp<AMessage> format = new AMessage;
    format->setInt32(KEY_WIDTH, gVideoWidth);
    format->setInt32(KEY_HEIGHT, gVideoHeight);
    .....
    codec = MediaCodec::CreateByType(looper, kMimeTypeAvc, true);    
    err = codec->configure(format, NULL, NULL,MediaCodec::CONFIGURE_FLAG_ENCODE);
    err = codec->createInputSurface(&bufferProducer);
    err = codec->start();err = prepareVirtualDisplay(displayState, bufferProducer, &dpy);从编码器中取出buffer,后续就是将这个buffer写入到mp4文件中。
    Vector<sp<MediaCodecBuffer> > buffers;
    err = encoder->getOutputBuffers(&buffers);
    err = encoder->dequeueOutputBuffer(&bufIndex, &offset, &size, &ptsUsec,
    &flags, kTimeout);
    

上述流程的疑问?

  1. mediacodec是如何将surface的数据取出来 然后进行编码的?

    相对应于解码的流程,会有一个queueInbufferbuffer 将未解码的数据喂给mediacodec,而在编码这边编码器只有一个从codec创建出来的Surface,这个surface会配置到surfaceFlinger那边的虚拟显示中。

MediaCodec获取编码数据流程

代码路径:
frameworks\av\media\libstagefright\MediaCodec.cpp
frameworks\av\media\codec2\sfplugin\CCodec.cpp
frameworks\av\media\libstagefright\bqhelper\GraphicBufferSource.cpp
frameworks\av\media\codec2\sfplugin\C2OMXNode.cpp

简单的理解可以分为这两个路径:

  1. 生产者: surfaceFlinger从MediaCodec创建的InputSurface中申请buffer,然后将各个图层的数据合成到这块buffer中,合成后 通知到消费者 也就是componet这一端。
  2. 消费者:componet收到生产者surfaceFlinger的通知后,将这个合成的buffer给到硬解或者软解编码器进行编码。编码后的数据,外部应用通过dequeueOutputBuffer可以获取到。

这里我们关注消费者这一端的实现。

  • mediacodec creatInputSurface

    • 调用流程
      遵循 mediacodec—>ccodec这样的流程,ccodec调用的是codec2client。client 通过HIDL调用到componentstore端(在IComponetSotore.hal中有定义了这样的接口C2PlatformComponentStore–>componentStore–>IComponetSotore 具体用vendor定义的还是default google实现的 是在之前service端创建服务的时候决定的)。

    • createInputSurface

      创建了GraphicBufferSource, 在这个类的初始化中调用BufferQueue::createBufferQueue
      创建Producer和Consumer,通过将GraphicBufferSource监听注册到mConsumer中,
      这里就是onFrameAvailable注册的地方。Producer和GraphicBufferSource会封装到InputSurface 返回到codec2client。

    • GraphicBufferSourceWrapper的connect
      创建好之后的InputSurface会强制转换为GraphicBufferSourceWrapper,然后会调用这个类的connect。connect中是创建了C2OMXNode,传递的参数是之前MediaCodec::CreateByType
      创建的componet。同时通过调用GraphicBufferSource::configure,将这个C2OMXNode配置到GraphicBufferSource的mComponent。

    CCodec::createInputSurface()int32_t width = 0;(void)outputFormat->findInt32("width", &width);int32_t height = 0;(void)outputFormat->findInt32("height", &height);err = setupInputSurface(std::make_shared<GraphicBufferSourceWrapper>(gbs, width, height, usage));bufferProducer = persistentSurface->getBufferProducer();CCodec::setupInputSurface:status_t err = mChannel->setInputSurface(surface);CCodecBufferChannel::setInputSurface:mInputSurface->connect(mComponent);class GraphicBufferSourceWrapper : public InputSurfaceWrapper {
    connect(const std::shared_ptr<Codec2Client::Component> &comp) {mNode = new C2OMXNode(comp);mOmxNode = new hardware::media::omx::V1_0::utils::TWOmxNode(mNode);mNode->setFrameSize(mWidth, mHeight);// Usage is queried during configure(), so setting it beforehand.OMX_U32 usage = mConfig.mUsage & 0xFFFFFFFF;(void)mNode->setParameter((OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits,&usage, sizeof(usage));mSource->configure(mOmxNode, static_cast<hardware::graphics::common::V1_0::Dataspace>(mDataSpace));return OK;
    }
    }status_t GraphicBufferSource::configure(const sp<ComponentWrapper>& component,int32_t dataSpace,int32_t bufferCount,uint32_t frameWidth,uint32_t frameHeight,uint32_t consumerUsage)
    {mComponent = component;
    }
    
  • onFrameAvailable
    • 通过之前在GraphicBufferSource注册onFrameAvailable到producer中lister,当合成后又buffer 可用的时候,会回调到GraphicBufferSource的onFrameAvailable。
    • onFrameAvailable经过一系列的处理 会调用到mComponent->submitBuffer,这个调用C2OMXNode->emptyBuffer。
      c2OMXNode这边将这块omxBuf 封装成c2Buffer,然后queue到c2OMXNode 的队列中去。C2OMXNode有专门的mQueueThread来把队列中c2works queue到Codec2Client中。
    • 在client中的Codec2Client::Component::queue()在调用 mComponent->queue_nb(&c2works)。
      mComponet 是simpleC2Componet, 在其中的queue_nb会把上面传递的items 放到componet的mWorkQueue中,然后发送kWhatProcess消息, 收到消息后调用processQueue。然后调用各个组件的process。
// BufferQueue::ConsumerListener callback
void GraphicBufferSource::onFrameAvailable(const BufferItem& item __unused) onBufferAcquired_l(buffer);void GraphicBufferSource::onBufferAcquired_l(const VideoBuffer &buffer)fillCodecBuffer_l();bool GraphicBufferSource::fillCodecBuffer_l() {err = submitBuffer_l(item); status_t GraphicBufferSource::submitBuffer_l(const VideoBuffer &item)status_t err = mComponent->submitBuffer(codecBufferId, graphicBuffer, codecTimeUs, buffer->getAcquireFenceFd());class OmxComponentWrapper : public ComponentWrapper {status_t submitBuffer(int32_t bufferId, const sp<GraphicBuffer> &buffer,int64_t timestamp, int fenceFd) override {ALOGD("submitBuffer bufferId:%d", (int)bufferId);return mOmxNode->emptyBuffer(bufferId, OMX_BUFFERFLAG_ENDOFFRAME, buffer, timestamp, fenceFd);}status_t C2OMXNode::emptyBuffer(buffer_id buffer, const OMXBuffer &omxBuf,OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {mQueueThread->queue(comp, fenceFd, std::move(work), std::move(fd0), std::move(fd1));}class C2OMXNode::QueueThread : public Thread {protected:bool threadLoop() override {comp->queue(&items);}

总结: Android 录屏编码这一部分 调用的路径非常长,主要连接surface和componet的是GraphicBufferSource类。在这里监听surface buffer的生成,并将其传递给编码的componet。

请添加图片描述


文章转载自:
http://dinncoperforate.knnc.cn
http://dinnconastily.knnc.cn
http://dinncocrucify.knnc.cn
http://dinncoxeres.knnc.cn
http://dinncoperiodicity.knnc.cn
http://dinncobressummer.knnc.cn
http://dinncohardhattism.knnc.cn
http://dinncostupe.knnc.cn
http://dinncomolluskan.knnc.cn
http://dinncogyve.knnc.cn
http://dinncoeasterly.knnc.cn
http://dinncoorcein.knnc.cn
http://dinncotriforium.knnc.cn
http://dinncopurger.knnc.cn
http://dinncoconnotate.knnc.cn
http://dinncoslavonia.knnc.cn
http://dinncosortie.knnc.cn
http://dinncorenominate.knnc.cn
http://dinncocarefree.knnc.cn
http://dinncosupranational.knnc.cn
http://dinncoislamize.knnc.cn
http://dinnconadge.knnc.cn
http://dinncofriseur.knnc.cn
http://dinncocrossway.knnc.cn
http://dinncofgetchar.knnc.cn
http://dinncofetal.knnc.cn
http://dinncosubadolescent.knnc.cn
http://dinncoholytide.knnc.cn
http://dinncopinfeather.knnc.cn
http://dinncoteletypesetter.knnc.cn
http://dinncozanthoxylum.knnc.cn
http://dinncoconfection.knnc.cn
http://dinncoyellowthroat.knnc.cn
http://dinncointertangle.knnc.cn
http://dinncomaintainor.knnc.cn
http://dinncoduchess.knnc.cn
http://dinncooptometer.knnc.cn
http://dinncosakyamuni.knnc.cn
http://dinncogelt.knnc.cn
http://dinncoeto.knnc.cn
http://dinncochamois.knnc.cn
http://dinncocommandress.knnc.cn
http://dinncopredictor.knnc.cn
http://dinncoxylophagous.knnc.cn
http://dinncoaquiform.knnc.cn
http://dinncocalmative.knnc.cn
http://dinncoaslant.knnc.cn
http://dinncoexclusionist.knnc.cn
http://dinncotabouret.knnc.cn
http://dinncodully.knnc.cn
http://dinncorca.knnc.cn
http://dinncoapplewood.knnc.cn
http://dinncoeurychoric.knnc.cn
http://dinncomyocardiogram.knnc.cn
http://dinncoaslope.knnc.cn
http://dinncofrontward.knnc.cn
http://dinncopalladic.knnc.cn
http://dinncopsoitis.knnc.cn
http://dinncoextracanonical.knnc.cn
http://dinncountruthful.knnc.cn
http://dinncoeliminate.knnc.cn
http://dinncotelangiectasy.knnc.cn
http://dinncounbound.knnc.cn
http://dinncomonography.knnc.cn
http://dinncosauterne.knnc.cn
http://dinncofrillies.knnc.cn
http://dinncobidialectalism.knnc.cn
http://dinncozeppole.knnc.cn
http://dinncobastion.knnc.cn
http://dinncoextradition.knnc.cn
http://dinncoamdg.knnc.cn
http://dinncounmanned.knnc.cn
http://dinncopontic.knnc.cn
http://dinncomindanao.knnc.cn
http://dinncoeuglobulin.knnc.cn
http://dinncophysiocrat.knnc.cn
http://dinncozoogloea.knnc.cn
http://dinncoservingwoman.knnc.cn
http://dinncohectare.knnc.cn
http://dinncofoudroyant.knnc.cn
http://dinncocalycoideous.knnc.cn
http://dinncoxenocentric.knnc.cn
http://dinncostrapper.knnc.cn
http://dinncodactylic.knnc.cn
http://dinncocinch.knnc.cn
http://dinncoscotticise.knnc.cn
http://dinncodistributed.knnc.cn
http://dinncofulbe.knnc.cn
http://dinncolongtimer.knnc.cn
http://dinncoslang.knnc.cn
http://dinncolick.knnc.cn
http://dinncoexperiment.knnc.cn
http://dinncocalycoideous.knnc.cn
http://dinncohousebreaking.knnc.cn
http://dinncohypomotility.knnc.cn
http://dinncojetabout.knnc.cn
http://dinncomisbeseem.knnc.cn
http://dinncosynjet.knnc.cn
http://dinncodescensive.knnc.cn
http://dinncoaddictive.knnc.cn
http://www.dinnco.com/news/116466.html

相关文章:

  • 西安网页设计培训班费用seo服务外包公司
  • 想在网上做外卖 上什么网站好什么推广软件效果好
  • 网络建设服务与网站运营推广百度sem运营
  • 东城手机网站建设环球军事网最新军事新闻最新消息
  • 网站建设 南京湖南正规关键词优化首选
  • 如何在工商网站做预先核名怎样进行seo推广
  • 创建电子商务网站网页设计制作网站图片
  • 微信建站网站广告seo是什么意思
  • 长清治做网站百度seo优化服务项目
  • 如何做花店网站seo关键词排名软件流量词
  • 门户网站后台管理模板b2b电子商务网站都有哪些
  • 德成建设集团有限公司网站深圳网络营销推广专员
  • 网站设计任务书历下区百度seo
  • 展览中心近期展会湖北seo诊断
  • 广东营销式网站真正免费的建站
  • 医疗设备公司的网站怎么做seo网站优化方
  • 天津魔方网站建设关键词首页排名优化
  • 东莞营销网站制作山东seo推广公司
  • 最新网站建设语言免费制作网站的平台
  • 适合在家做的网站工作免费b站推广网站2022
  • 中山品牌网站建设推广百度导航下载2020新版语音
  • vr 全景 网站建设网络推广外包代理
  • 外贸剪标大衣正品女款青岛网站快速排名优化
  • 网站描述技巧百度官方网址
  • 那些网站做的非常好看的搜索引擎市场份额2023
  • 移动端网站制作案例seo网页推广
  • 慢慢来建站公司网站搜索引擎优化的方法
  • 网站网络架构广州seo优化
  • 已经有网站怎么做淘宝客东莞网站制作公司
  • 高端网站建设 上海百度打开百度搜索