MediaRecorder流程如下:

当使用CameraSource的时候MediaCodecSource会从CameraSource中取数据。

当使用Surface的时候不用CameraSource。

实际实现都是生产者消费者模型,由camera生产数据,由codec消费数据。只是具体实现过程不一样,camerasource录制使用的是puller,surface录制使用的是BufferQueue.

CameraSource:

  在MediaCodecSource::Create中创建MediaCodecSource对象,此处会判断当前对否是FLAG_USE_SURFACE_INPUT,若不是,则: mPuller = new Puller(source);

MediaCodecSource::Puller中有存放数据的Queue,并且响应各种对Queue的操作。

大概流程如下:

Puller中readbuffer的调用过程:

  • MediaCodecSource::onMessageReceived收到消息kWhatPullerNotify或者kWhatEncoderActivity, kWhatPullerNotify是由MediaCodecSource::onStart发出,kWhatPullerNotify是由MediaCodec::onInputBufferAvailable()发出的。
  • MediaCodecSource::feedEncoderInputBuffers()在此函数中把数据取出来,并调用mediacodec的queueInputBuffer,最终调用acodec的ETB.
  • mPuller->readBuffer(&mbuf)

  (此处是从queue里面取走数据)

Puller中pushBuffer的调用过程:

  • MediaCodecSource::Puller::onMessageReceived 收到 kWhatPull ,kWhatPull是由schedulePull发出的消息,在收到kWhatStart之后就会调用schedulePull。
  • queue->pushBuffer(mbuf);

  (此处就是从camerasource取到数据,然后把数据push到queue里面)

编码完的数据会送给mpeg4writer去写入文件。解码后的数据会送给disaplay去render。

Surface:

Surface录制没有puller。

大概流程如下:

此处listener负责监听,防止consumer需要一直查看bufferqueue是否有数据,listener发现有数据会通知consumer。

MediaCodecSource::initEncoder()

如果是APP提供provider则调用mEncoder->setInputSurface,否则调用mEncoder->createInputSurface

MediaCodec::createInputSurface 发送 kWhatCreateInputSurface,并返回bufferProducer给APP

ACodec::initiateCreateInputSurface 发送 kWhatCreateInputSurface

ACodec::LoadedState::onCreateInputSurface 在此函数中mCodec->mOMX->createInputSurface(&bufferProducer, &mCodec->mGraphicBufferSource);会创建bufferProducer和mGraphicBufferSource。ACodec拿到的是mGraphicBufferSource,只能做一些参数设置,具体的数据写入读出不在ACodec中做。

IOMX.h的createInputSurface Bn

LWOmx::createInputSurface  Bp *bufferProducer = new H2BGraphicBufferProducer(tProducer); *bufferSource = new LWGraphicBufferSource(tSource);

ACodec::LoadedState::setupInputSurface() 在此函数中mCodec->mGraphicBufferSource->configure(mCodec->mOMXNode, dataSpace),将mGraphicBufferSource和omx关联起来。

LWGraphicBufferSource::configure

IGraphicBufferSource::configure 接口类,在TWGraphicBufferSource被实现

TWGraphicBufferSource::configure omxNode->setInputSurface(mOmxBufferSource) 和 mBase->configure(new TWOmxNodeWrapper(omxNode),toRawDataspace

(dataspace),def.nBufferCountActual,def.format.video.nFrameWidth,def.format.video.nFrameHeight,consumerUsage)

LWOmxNode::setInputSurface 在此函数中mBase->setInputSurface(new TWOmxBufferSource(bufferSource))

OmxGraphicBufferSource::configure

GraphicBufferSource::configure   GraphicBufferSource::GraphicBufferSource()中BufferQueue::createBufferQueue(&mProducer, &mConsumer); 在mConsumer就会调用acquireBuffer、releaseBuffer等函数,实现数据的写入读出。

设置完成之后上层可以通过调用getIGraphicBufferProducer获取mProducer并返回给APP。mConsumer会调用mConsumer->consumerConnect连接到listener。

BufferQueueProducer调用queueBuffer、requestBuffer、dequeueBuffer等函数实现数据的写入读出。BufferQueueProducer在调用dequeueBuffer中会通知frameAvailableListener->onFrameAvailable。然后会调用到GraphicBufferSource::onFrameAvailable,然后调用过程如下:

GraphicBufferSource::onFrameAvailable

GraphicBufferSource::onBufferAcquired_l

GraphicBufferSource::fillCodecBuffer_l

GraphicBufferSource::submitBuffer_l

OmxGraphicBufferSource.cpp中submitBuffer 调用 mOmxNode->emptyBuffer

Android视频录制-MediaRecorder流程相关推荐

  1. Android视频录制从不入门到入门系列教程(一)————简介

    一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...

  2. 利用FFmpeg玩转Android视频录制与压缩(二)

    请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个 ...

  3. 利用FFmpeg玩转Android视频录制与压缩(三)

    请尊重原创,转载请注明出处http://blog.csdn.net/mabeijianxi/article/details/73011313 前言 上一回说到啊,这千秋月没是佳人离别,时逢枯枝落旧城, ...

  4. Android视频录制--屏幕录制

    上一篇介绍了MediaProjection,这个类可以用来实现安卓屏幕数据的采集,也就是手机一帧帧的截图,并输出成byte流的格式. 有兴趣的同学可以看这篇: Android视频录制--MediaPr ...

  5. Android视频录制并转GIF格式

    一.概述 我们在学习Android时候,往往需要查阅很多的资料教程,这时候经常会发现大神写的博客往往都是图文并茂的,充满可能性,效果直观的,所以自己个人记录一些日常工作中遇到的问题以及见解,也希望能够 ...

  6. 用FFmpeg玩转Android视频录制与压缩

    [置顶] 利用FFmpeg玩转Android视频录制与压缩(二) 标签: Android视频采集Android视频编码Android FFmpegAndroid 视频压缩视频编码 2017-06-10 ...

  7. android 视频录制和上传,关于android实时视频录制与上传 .

    关于android的实时视频录制现在网上炒的很火,我想把自己学习研究的一个视频录制的demo 的心得与大家分享一下 使用的是MediaRecorder 以及使用SurfaceView进行录制的. 视频 ...

  8. android 视频录制小例子,android 录制视频实例 VideoRecordDemo

    [实例简介] [实例截图] [核心代码] package com.example.videorecorddemo; import java.io.IOException; import java.ut ...

  9. android 视频录制 保存到本地

    2021.1.19 更新: github下载地址. 有用的话麻烦点个星星 谢谢 下面贴一下 主要的代码 详细 请去下载我上传的dmeo /******************************* ...

最新文章

  1. [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )
  2. 聊一聊多源最短路径问题(只有5行代码哦)
  3. 技术大牛收割机!Java之父James Gosling现在哪里???
  4. post方法就返回了一个string字符串前台怎么接_LoadRunner脚本编写教程Getamp;Post
  5. 阿里云的SLB,植入cookie和重写cookie有什么区别?
  6. 关于Cohen-Sutherland算法和Liang-Barsky算法
  7. vs可以编译python_Python如何进行编译和反编译
  8. Algorithms(forth edition),算法(第四版) algs4.jar 与 algs4-data.zip 网盘下载
  9. 五、实现一个10秒钟的倒计时,即:从10~0依次打印,每次打印间隔一秒
  10. 嵌入式Linux开发环境搭建
  11. HTML 字体 大小 颜色对照表
  12. 雷达传感器应用,微波雷达感应模块,物联网传感技术发展
  13. TCP RTT测量妙计
  14. poco http使用
  15. CVPR 2019 Oral 论文解读 | 百度提出关于网络压缩和加速的新剪枝算法
  16. Parallel ScavengeGC收集器
  17. MIT 18.01 Single Variable Calculus(单变量微积分)课堂笔记【3】——求导四则运算和三角函数求导
  18. nlp-知识图谱简介
  19. 【CAD二次开发】-ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)
  20. 干货 | Linux面试题(2020最新版)

热门文章

  1. 更改VMware硬盘大小
  2. Hibernate框架基本使用
  3. VS2008环境下开发的某些程序在其他机器运行提示“由于应用程序配置不正确,应用程序未能启动”的问题(IIS)...
  4. 大数据-数据抽取(数据降维)算法
  5. PHP MVC 组件 Medoo、Slim、Twig和Composer
  6. Java并发编程笔记
  7. BP神经网络分类实例(神经网络编程入门 )
  8. php数据的导出到excel,php 数据的导出到excel表格-怎么将php数据导出excel
  9. 分享微信朋友或朋友圈
  10. php 未定义数组索引_如何删除PHP数组元素键值并重新排序