====== MediaCodec ====== * Android 平台提供的硬解统一接口,接口内部实现采用异步消息制 * 官方文档:[[https://developer.android.com/reference/android/media/MediaCodec.html|MediaCodec]] * 相关源码:[[https://android.googlesource.com/platform/frameworks/base/+/master/media]], [[https://android.googlesource.com/platform/frameworks/av/+/master/media/]] * [[https://www.jianshu.com/p/5d62a3cf0741|Android平台MediaCodec避坑指北]] ===== 解码器状态 ===== * 解码器状态图:{{ :public:it:mediacodec_states.svg }} * 解码器存有缓存,输入帧与输出帧并不是一一对应对应输出,中间会差个几帧,只有收到EOS才会把缓冲帧全部输出。 * 如果要实现播放器暂停时,调整滚动条的一帧画面显示预览,得如下操作: - flush, 清除之前的缓冲帧 - input, 输入当前的一帧关键帧 - input, 输入EOS 流结束标志 - 接收 output 画面,直到收到 EOS - flush, 让解码器从 EOS 状态转为 Flushed 状态 - input, 输入与第二步同样的关键帧,因为播放器此时从暂停转为继续播放的话,会省略之前已发送的帧。如果解码器不先输入关键帧的话,后续的画面会花屏一阵子。