Multimedia框架,包含MediaPlayer, Camera, MediaCodec,Surface, MediaRecord。
MediaPlayer类是用于控制playback的视频/音频文件 及 流。
背景: Android2.3时引入流媒体框架,而流媒体框架的核心是NuPlayer。在之前的版本中一般认为Local Playback就用Stagefrightplayer+Awesomeplayer,流媒体用NuPlayer。 Android4.0之后HttpLive和RTSP协议开始使用NuPlayer播放器,Android5.0(L版本)之后本地播放也开始使用NuPlayer播放器。 Android7.0(N版本)则完全去掉了Awesomeplayer。 通俗点说,NuPlayer是AOSP中提供的多媒体播放框架,能够支持本地文件、HTTP(HLS)、RTSP等协议的播放,通常支持H.264、H.265/HEVC、AAC编码格式,支持MP4、MPEG-TS封装。 NuPlayer和Awesomeplayer差异: 1 NuPlayer基于StagefrightPlayer的基础类构建,利用了更底层的ALooper/AHandler机制来异步地处理请求,ALooper列队消息请求,AHandler中去处理,所以有更少的Mutex/Lock在NuPlayer中。 2 Awesomeplayer中利用了omxcodec而NuPlayer中利用了Acodec。 |
camera2框架
CmaeraManager: 摄像头管理者,这是一个全新的系统管理者,专门用户检测系统摄像头,打开系统摄像头,除此之外,调用CameraManager的getCameraCharacteristics(String)方法即可获取指定摄像头的相关特性。 CameraCharacteristics:摄像头特性。该对象通过CameraManager来获取,用于描述特定摄像头所支持的各种特性。 CameraDevice:代表系统摄像头。该类的功能类似于早期的Camera类。 CameraCaptureSession:这是一个与摄像头建立会话的类,当程序需要预览、拍照时,都需要先通过该类的实例创建Session。而且不管预览还是拍照,也都是由该对象的方法进行控制的,其中控制预览的方法为setRepeatingRequest();控制拍照的方法为capture()。 为了监听CameraCaptureSession的创建过程,以及监听CameraCaptureSession的拍照过程,Camera2 API为CameraCaptureSession提供了StateCallback、CaptureCallback等内部类。 CameraRequest和CameraRequest.Builder:当程序调用setRepeatingRequest()方法进行预览时,或调用capture()方法进行拍照时,都需要传入CameraRequest参数。CameraRequest代表了一次捕获请求,用于描述捕获图片的各种参数设置,比如对焦模式、曝光模式……程序需要对照片所做的各种控制,都通过CameraRequest参数进行设置。可以理解一个请求参数一样,CameraRequest.Builder则负责生成CameraRequest对象。 ? ? ??Google采用了pipeline(管道)的概念,将Camera Device相机设备和Android Device安卓设备连接起来 - Android Device通过管道发送CaptureRequest拍照请求给Camera Device - Camera Device通过管道返回CameraMetadata数据给Android Device - 最后这一切建立在一个叫作CameraCaptureSession的会话中。 ?
MediaCodec
硬编解码,底层调用dsp芯片接口。
mediaCodec = MediaCodec.createDecoderByType("video/avc");
mediaCodec.configure(mediaformat, surface, null, 0);
stagefright框架
mediaplayerservice会调到Stagefright中,进行编码解码操作。 在libsstagefright中,预设的多媒体解码是openCore,由于其过于庞大和复杂,需要成本较高,开始引进了另一个框架,也就是stagefright框架,以后默认情况android选择stagefright,但是并没有完全抛弃opencore,做了一个OMX层,仅仅是对 opencore的omx-component部分做了引用。stagefright是和opencore是并列的。Stagefright在 Android中是以shared library的形式存在(libstagefright.so),其中的module – AwesomePlayer可用来播放video/audio。 AwesomePlayer提供许多API,可以让上层的应用程序(Java/JNI)来调用。
?
NuPlayer是谷歌新研发的,AwesomePlayer存在BUG,早已在android m 版本中弃用。
|