前言
本篇文章主要是理解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(displaySt