前言:
Android 的 libstagefright 库提供了 MediaCodec 组件,让应用层可以直接与 平台编解码器 交互。
MediaCodec 既有 JAVA 接口(\frameworks\base\media\java\android\media\MediaCodec.java),又有 NDK 接口(/frameworks/av/media/ndk/include/NdkMediaCodec.h && /frameworks/av/media/ndk/NdkMediaCodec.cpp)。开发者可以自行选择使用 JAVA 还是 c++ 对MediaCodec 进行封装,由此可见MediaCodec 的重要性。
MediaCodec 的功能定位是编解码器中间件,它规范了编解码器的工作流程,并提供了成员变量mCodec 和 mBufferChannel 给平台层用以集成,平台层只需要实现两个继承于类CodecBase 和 BufferChannelBase 的子类,然后把他们自己实现的类封装成动态库,再把动态库注册到 libstagerfrightloader 里面即可,这样MediaCodec便可以连接到自定义的 CodeBase 子类 和 BufferChannelBase 子类。
不论是 JAVA 接口还是 NDK 接口,最终都会进入 native MediaCodec : /frameworks/av/media/libstagefright/MediaCodec.cpp
官方参考:https://developer.android.com/reference/android/media/MediaCodec
NDK 接口介绍:
见:/frameworks/av/media/ndk/include/media/NdkMediaCodec.h
native 介绍:
源码:/frameworks/av/media/libstagefright/MediaCodec.cpp