录屏技术点

  1. VirtualDisplay的surface选用。系统自带了一个MediaRecorder,可以录入文件,这个类有一个surface可以作为VirtualDisplay的参数。最初是采用的这个方案,由于需要分析屏幕上的内容,需要将视频中的一帧截取出来。在这个方案里,我们只能在编码完成时,即将mux时,对sampledata解码,得到帧数据。
    • 这里有个注意点是H.264编码需要在MediaFormat中设置csd-0字段,这个字段的内容可以在MediaCodec的回调中获得,具体是当BufferInfo.flag为BUFFER_FLAG_CODEC_CONFIG时,在ByteBuffer的内容即是。

上面的方案有个问题,问题是我们需要在将视频数据编码再解码,造成性能损耗,其实可以将这一步省略掉,具体是采用OpenGL技术,创建一个texture,在根据这个texture创建一个SurfaceTexture,继而创建一个Surface,作为VirtualDisplay的参数。这样我们可以直接获得原数据。缺点是我们得自己进行编码,写文件,所幸MediaCodec,MediaMuxer不复杂。

  1. 音频录制和视频录制,presentationTime要保持一致,我碰到了极度不一致的情况(万恶的copy代码),导致播放器播放要么没有视频,要么没有音频。
    • presentationTime的单位是微妙
  2. MediaMuxer 需要addTrack后再start
  3. SPS Sequence Parameter Setting PPS Picture Parameter Setting
  4. 编码为H264,当BufferInfo.flag 为BUFFER_FLAG_KEY_FRAME时,将csd-0字段的内容放在帧数据的前面,就是关键帧