那么一个类的对外接口部分通常包括:
- 构造函数和析构函数
- 必须调用的接口
- 可选的调用接口
在多媒体播放中,通过关注的点有:
- 如何实现解复用,得到音频、视频、字幕等数据
- 如何实现解码
- 如何实现音视频同步
- 如何渲染视频
- 如何播放音频
- 如何实现快速定位
- 不同格式的多媒体文件如何探测并解析的?音视频数据缓冲区在哪里?(Source)
- 视频如何显示的?音频如何播放的?音视频同步在哪里?(Renderer)
- 音频解码线程、视频解码线程在哪里? (DecoderBase)
http://www.cnblogs.com/tocy/p/5-nuplayer-GenericSource-source-code-analysis.html
ACodec与MediaCodec的通知
http://blog.csdn.net/coolcary/article/details/51939080
Renderer对video的处理是判断video是否已经延迟过长,如果是就不渲染了。
渲染开始是在ACodec的onOMXFillBufferDone,ACodec发消息到MediaCodec,MediaCodec会updateBuffers然后调用onOutputBufferAvailable中通知Decoder有可用的output buffer.
Decoder接收消息后就handleAnOutputBuffer.之后Decoder和Renderer交互,会判断是否渲染,通知Renderer会回调Decoder的onRenderBuffer(msg),然后Decoder会和MediaCodec交互,
MediaCodec判断是软件渲染或者硬件渲染,软件渲染就交给SofterwareRender,硬件渲染就交给ACodec。不管MediaCodec决定这么渲染,都会回调到ACodec中的onOutputBufferDrained(msg),继续fillbuffer,之后ACodec被OMX继续回调onOMXFillBufferDone.
http://blog.csdn.net/coolcary/article/details/51939158
Decoder会和MediaCodec做交互,做渲染。MediaCodec是判断视频渲染的关键。
交给MediaCodec的renderOutputBufferAndRelease 或者 releaseOutputBuffer;一个会真的渲染一个不渲染
这个应该是一开始就创建好的一个类!
MediaMetadataRetriever类提供了一个统一的接口用于从一个输入媒体文件中取得帧和元数据。
mediascanner----》StagefrightMediaScanner
http://blog.csdn.net/vincent_blog/article/details/9983581
实际解码过程中,无外乎获取输入的压缩数据,MediaCodec解码,返回解码之后的数据,渲染
实际的解码开始是从onSetRenderer开始,Part 4中对这个函数的实现也有介绍,循环解码的逻辑来在于onRequestInputBuffers函数,其中会调用doRequestBuffers
解码前的数据准备 MediaCodec::CB_INPUT_AVAILABLE handleAnInputBuffer
解码后的数据处理函数是handleAnOutputBuffer,响应MediaCodec::CB_OUTPUT_AVAILABLE消息
AVFactory::get()->createACodec(); // MediaFilter
ACodec与MediaCodec的通知。OMX的组件解码之后,当ACodec的onOMXFillBufferDone会被回调,去取得解码后的数据。
ACodec在onOMXFillBu