【Android源码 栏目提醒】:网学会员为广大网友收集整理了,【Android系统原理与开发要点详解】09_Android的多媒体系统 - 操作系统,希望对大家有所帮助!
第一部分 多媒体系统的结构第二部分 多媒体的各个层次第三部分 多媒体实现的核心部分OpenCore
Android的多媒体部分的框架涉及到应用层、JAVA框架、C语言框架、硬件抽象层等环节。
多媒体主要包括两方面的内容 输入输出环节音频视频的输入输出 中间处理环节编解码环节 其中输入输出环节由其他方面的硬件抽象层实现中间处理环节主要由PacketVideo实现可以使用硬件加速。
Android的多媒体应用业务 Music Player Video Player Camera Sound Recorder Camcorder Video Telephone Media ServiceMedia APIMedia JNIJava Class of MedialibmediaMediaPlayerJava 框架MediaRecorderIMediaPlayerIMediaRecorderPVPlayerPVAuthorIPC JAVA类frameworks/base/media/java/
android/media/类的名称为
android.media.JAVA本地调用部分JNIframeworks/base/media/这部分内容编译成为目标是libmedia_jni.so.基于OpenCore的多媒体播放器和记录器external/opencore/ 多媒体框架的media库frameworks/base/include/media/frameworks/base/media/libmedia/ 这部分的内容被编译成库libmedia.so。
多媒体服务部分frameworks/base/media/libmediaplayerservice/这部分内容被编译成库libmediaplayerservice.so。
从多媒体应用实现的角度主要包括两方面的内容 输入输出环节音频、视频纯数据流的输入输出系统 中间处理环节文件格式处理环节和编解码环节以一个MP3播放器为例从功能的角度就是将一个mp3格式的文件作为播放器的输入将声音从播放设备输出。
从实现的角度MP3播放器经过了一下的阶段MP3格式的文件解析、MP3编码流的解码、PCM输出的播放。
文件格式解析单元MP3编码流MP3文件解码单元PCM数据音频输出设备
Android的多媒体系统SurfaceFlingerNativeFrameWorkDriverPacket Video FrameworkPVAuthorPVPlayermediaplayerandroid.media.MediaRecorderJava FrameWorkJava AplicationMainframebufferHardware CodecVideo Plane AudioDriverCameraAudioFilngerCameraHALCameraDriverAudioHALMediaPlayer SeriviceCamera ServiceMidiPlayerVorbisPlayermediarecorderandroid.hardware.Cameraandroid.media.MediaPlayerandroid.view.SurfaceCamera / Camcorder Music MediaPlayerSoundRecoderandroid.widget.VideoViewOverlayHAL 音频/视频播放器NativeFrameWorkDriverPacket Video FrameworkPVPlayermediaplayerJava FrameWorkJava AplicationHardware CodecMediaPlayer SeriviceMidiPlayerVorbisPlayerStreamMediaMediaFileVideo StreamAudio Streamandroid.media.MediaPlayerandroid.view.SurfaceMusic MediaPlayerandroid.widget.VideoViewVideo PlayerMusicPlayerAudioDriverAudioFilngerAudioHALSurfaceFlingerMainframebufferVideo Plane OverlayHAL NativeDriverJava FrameWorkJava AplicationCameraCameraHALCameraDriverCamera Serviceandroid.hardware.Cameraandroid.view.SurfaceCameraJPEGFileVideo PreviewViewfinderEncoder To JPEG FileSurfaceFlingerMainframebufferVideo Plane Overlay照相机 NativeDriverPacket Video FrameworkPVAuthorandroid.media.MediaRecorderJava FrameWorkJava AplicationHardware CodecmediarecorderSoundRecoderAudioFileandroid.media.MediaPlayerMediaPlayer SeriviceAudioStreamAudioDriverAudioFilngerAudioHAL录音机 NativeDriverPacket Video FrameworkPVAuthorandroid.media.MediaRecorderJava FrameWorkJava AplicationHardware CodecCameraCameraHALCameraDriverCamera Servicemediarecorderandroid.view.SurfaceMediaFileVideo StreamAudioStreamPreviewCamcorder
android.widget.VideoViewMediaPlayer SeriviceSurfaceFlingerMainframebufferVideo Plane AudioDriverAudioFilngerAudioHALOverlay摄像机 2.1 libmedia的框架部分2.2 多媒体服务2.3 多媒体部分的JNI代码2.4 多媒体部分的JAVA 框架代码2.5 类
android.widget.VideoView
Android多媒体部分的C语言部分的核心是media库它主要记录了媒体播放器和媒体记录器的框架。
media库向上层通过JNI提供接口下层通过Packet Video等实现。
IMediaPlayerClientBnMediaPlayerClientMediaPlayerIMediaPlayerBnMediaPlayerandroid_media_MediaPlayerJAVAIMediaPlayerServiceBnMediaPlayerServiceMediaPlayerServiceMediaPlayerService::ClientMediaPlayerServiceMediaPlayerBaseMediaPlayerInterfacePVPlayerPVPlayerIMediaPlayermediaplayerIMediaPlayerClientIMediaPlayerServiceMediaPlayerInterfaceIPC媒体播放器 MediaRecorderIMediaRecorderBnMediaRecorderandroid_media_recorderJAVAIMediaPlayerServiceBnMediaPlayerServiceMediaPlayerServiceMediaPlayerService::MediaRecorderClientMediaPlayerServicePVAuthorPVAuthorIMediaRecorderMediaRecorderIMediaPlayerServicexIPCIMediaPlayerClientBnMediaPlayerClientIMediaPlayerClient媒体记录器 媒体元信息MediaMetadataRetrieverIMediaMetadataRetrieverBnMediaMetadataRetrieverandroid_media_MediaMetadataRetrieverJAVAIMediaPlayerServiceBnMediaPlayerServiceMediaPlayerServiceMediaPlayerService::ClientMediaPlayerServiceMediaMetadataRetrieverBase MediaMetadataRetrieverInterface PVMetadataRetrieverPVMetadataRetrieverIMediaMetadataRetrievermediametadataretrieverIMediaPlayerServiceMediaMetadataRetrieverInterfaceIPC 多媒体服务的守护进程的代码 frameworks/base/media/mediaserver/ 其中只有一个源文件main_mediaserver.cpp将被编译成为一个可执行程序mediaserver。
它负责启动了多媒体服务、照相机服务音频服务这三个服务service media /system/bin/mediaserver user media group system audio camera graphics inet net_bt net_bt_admin 多媒体服务提供多媒体的服务部分多媒体服务通过IPC与libmedia库通信多媒体服务其路径是frameworks/base/media/libmediaplayerservice/ 其中主要的类是MediaPlayerService从这个类中可以获取IMediaPlayer和IMediaRecorder两个实现类。
IPCMediaRecorder IMediaRecorderMediaRecorderClient PVMediaRecorderIPCMediaMetadataRetrieverIMediaMetadataRetrieverMetadataMediaRetrieverClient PVMediaMetadataRetrieverIPCMediaPlayer IMediaPlayer MediaPlayerService::ClientMediaPlayerBasePVPlayerMidiFileVorbisPlayer MediaPlayerService的定义class MediaPlayerService : public BnMediaPlayerService virtual sp createMediaRecorderpid_t pid virtual sp createMetadataRetrieverpid_t pid virtual sp createpid_t pid const sp client const char url virtual sp createpid_t pid const sp client int fd int64_t offset int64_t length media的JAVA本地调用部分JNIframeworks/base/media/这部分内容编译成为目标是libmedia_jni.so.主要文件是
android_media_MediaPlayer.cppandroid_media_MediaRecorder.cpp JAVA类frameworks/base/media/java/
android/media/主要的文件是MediaPlayer.javaMediaRecorder.java分别表示两个类
android.media.mediaPlayerandroid.media.mediaRecorder 这两个类的接口和JNI层次乃至本地代码是非常类似的。
VideoView是一个media集成的高层的JAVA类这个类的文件是frameworks/base/core/java/
android/widget/文件的类型是VideoView.java类的路径是
android.widget.java VideoView是一个集成了MediaPlayer和SurfaceView的类可以作为一个UI元素View直接放置在JAVA应用的界面中用于视频的播放。
3.1 OpenCore概述3.2 OpenCore的层次结构3.3 OpenCore的OSCL部分3.4 OpenCore的文件格式和编解码部分3.5 OpenCore Node介绍3.6 OpenCore 的移植和扩展3.7 OpenCore Player介绍3.8 OpenCore Author介绍 OpenCore是一个多媒体的框架从宏观上来看它主要包含了两大方面的内容 PVPlayer 提供媒体播放器的功能完成各种音频Audio、视频Video流的回放Playback功能 PVAuthor 提供媒体流记录的功能完成各种音频Audio、视频Video流的捕获Recording功能 PVPlayer和PVAuthor以SDK的形式提供给开发者可以在这个SDK之上构建多种应用程序和服务。
在移动终端中常常使用的多媒体应用程序例如媒体播放器、照相机、录像机、录音机等等。
OSCLOperating System Compatibility LibraryPVMFPacketVideo Multimedia FrameworkPVAuthor EnginePVPlayer EngineAndroid PlayerAndroid AuthorAndroid HALNODENODEOS libCodec NODEsFileFormat NODEsSink/Source NODEs3rd CodecVideo Output Audio IOCamera2way EngineOpenCoreAndroid Media Framework OpenCore是一个多媒体的框架从宏观上来看它主要包含了两大方面的内容 OSCLOperating System Compatibility Library操作系统兼容层 PVMFPacketVideo Multimedia FrameworkPV多媒体框架 文件解析parser和组成composer两个部分 编解码部分 NODEs节点 Player Engine播放器引擎 Author Engine作者引擎 OSCL全称为Operating System Compatibility Library 操作系统兼容库它包含了一些在不同操作系统中移植层的功能它的在OpenCore oscl/oscl目录中一般每一个目录表示一个模块。
OSCL对应的功能是非常细致的几乎对C语言中每一个细节的功能都进行封装并使用了C的接口提供给上层使用。
事实上OperCore中的PVMF、Engine部分都在使用OSCL而整个OperCore的调用者也需要使用OSCL。
OpenCore有关文件格式处理和编解码部分两部分的内容分别在目录fileformats和codecs_v2当中。
这两部分都属于基础性的功能不涉及具体的逻辑因此它们被别的模块调用来使用。
文件格式处理有两种类型一种是parser解析器另一种是composer组成器。
编解码部分的子目录omx实现了一个khronos OpenMAX的功能。
OpenMAX是一个多媒体应用程序的框架标准 文件格式的处理部分 由于同时涉及播放文件和记录文件两种功能因此OpenCore中的文件格式处理有两种类型一种是parser解析器另一种是composer组成器。
其代码的目录为fileformats的目录其中包含mp3mp4wav等子目录。
其中包含了AVImp3mp4wav等多种文件的解析器和组成器各个目录中对应的是不同的文件格式等。
编解码部分 编解码部分主要针对Audio和Video的软件编解码其目录为codecs_v2其中包含了audio、omx 、utilities、video等几个目录。
在audio 和video目录中对应了针对各种流的子目录其中可能包含dec和enc两个目录分别对应解码和编码。
video -- avc_h264 -- common -- dec -- enc -- patent_disclaimer.txt -- m4v_h263 -- dec -- enc -- patent_disclaimer.txt codecs_v2目录的子目录omx实现了一个khronos OpenMAX的功能。
OpenMAX是一个多媒体应用程序的框架标准由NVIDIA公司和Khronos在2006年推出。
OpenMAX IL 1.0集成层技术规格定义了媒体组件接口以便在嵌入式器件的流媒体框架中快速集成加速式编解码器。
OpenMAX的设计实现可以让具有硬件编辑码功能的平台提供统一的接口和框架在OpenMAX中可以直接使用硬件加速的进行编解码乃至输出的功能对外保持统一的接口。
此处的OpenMAX则是基于一个纯软件的实现其实现的代码即是调用这里的video和audio目录中的软件编辑码的代码。
Node是OpenCore中基本的功能模块OpenCore本身提供了一些Node也可以由上层软件来实现。
本身提供的Node在OpenCore的nodes目录中。
OpenCore的Node主要分成三个类型编解码的Node文件格式的Node输入输出模块的Node。
OpenCore本身提供了很强大的功能在使用的过程中还可以对OpenCore进行扩展。
在扩展的使用一般是基于OpenCore的框架为其增加固定的插件。
插件主要一般可以做成Node的形式。
各种文件格式Node格式解析/组成Node各种文件解析程序各种文件组成程序基于OpenMax的编解码Node文件格式的插件软件OpenMax实现OpenMax实现插件OpenMax的封装各种编解码的NodeOpenMax的封装文件格式插件Node各种软件Codec其他编解码Node 编解码相关的Node包括pvomxbasedecnodepvomxaudiodecnodepvomxvideodecnodepvomxencnode等。
文件格式的Node包括pvwavffparsernode pvaacffparsernodepvamrffparsernodepvmp3ffparsernodepvmp4ffparsernodepvvideoparsernodepvmp4ffcomposernode等。
输入输出的Node包括pvmediainputnodepvmediaoutputnodepvdummyinputnodepvdummyoutputnodepvfileoutputnodepvdownloadmanagernode等。
此外还包括pvsocketnode、pvdownloadmanagernode等其他功能的Node。
MediaIO在pvmi/pvmf/include目录中的PvmiMIOControl.h和pvmi_media_transfer.h头文件中实现定义在实现的过程中只需要继承和构建其中的接口然后由框架最终实现成为Node在OpenCore系统中使用。
事实上MediaIO是对Node的一种封装封装成为多媒体的输入输出环节。
OpenCore的Player的编译文件是pvplayer/
Android.mk将生成动态库文件libopencoreplayer.so。
这个库包含了两方面的内容一方是Player的engine引擎一方面是为
Android构件的Player这实际上是一个适配器adapter。
engine的路径是engine/playeradapter的路径是
android。
libopencoreplayer.so中包含了以下内容 一些解码工具 文件的解析器MP4 解码工具对应的Node Player的引擎部分 编译文件engines/player/
Android.mk 为
Android构建的Player适配器 编译文件
android/
Android.mk 识别工具pvmi/recognizer 编解码工具中的OpenMAX部分codecs_v2/omx 对应插件Node的注册。
libopencoreplayer.so中的内容较多其中主要为各个文件解析器和解码器PVPlayer的核心功能在engines/player/
Android.mk当中而
android/
Android.mk的内容比较特殊它是在PVPlayer之上构建的一个为
Android使用的播放器。
OpenCore Common lib libopencorecommon.soPVMFPlayer EngineAndroid PlayerVideo Output Audio OutputPlayer DriverPVPlayerlibopencoreplayer.so 组成部分 播放器核心引擎 适配器PVPlayer Video输出环节 Audio输入环节 OpenCore的Player Engine具有清晰明确的接口在这个接口上不同的系统可以根据情况实现不同的Player。
位于OpenCore中的engines/player/目录下其中engines/player/include目录中保存的是接口头文件engines/player/src目录中保存是源文件和私有头文件 。
Player Engine的类结构GetPVPlayerStateAddDataSourceInitAddDataSinkPrepareStartPauseResumeStopRemoveDataSinkResetRemoveDataSourcePVPlayerInterfacePVPlayerFactoryPVPlayerDataSinkPVPlayerDataSinkFilenamePVPlayerDataSinkPVMFNodePVPlayerDataSourcePVPlayerDataSourcePVMFNodePVPlayerDataSourceURLPVPlayerEngine PVMediaPlayerandroid_surface_outputandroid_audio_mioSink NodeMediaURLAudio DataVideo DataPVPlayerSink NodePV Player EngineAudio OutputVideo Outputandroid_audio_streamandroid_audio_outputPVPlayer 的结构Sink Node接受上一个Node写的动作 GetPVPlayerStateAddDataSourceInitAddDataSinkPrepareStartPauseResumeStopRemoveDataSinkResetRemoveDataSourcePVPlayerInterfacePVPlayerFactoryPVPlayerDataSinkPVPlayerDataSinkFilenamePVPlayerDataSinkPVMFNodePVPlayerPVPlayerDriverAndroidSurfaceOutputAndroidAudioOutputMediaPlayerInterfacePVPlayer的类结构 OpenCore的Author的编译文件是pvauthor/
Android.mk将生成动态库文件libopencoreauthor.so。
与Player类似这个库包含了两方面的内容一方是Author的engine引擎一方面是为
Android构件的Author这实际上是一个适配器adapter。
engine的路径是engine/authoradapter的路径是
android/author。
libopencoreauthor.so中包含了以下内容 一些编码工具例如视频流H263、H264和音频流Amr 文件的组成器MP4 编码工具对应的Node 表示媒体输入的Node 编译文件nodes/pvmediainputnode/
Android.mk Author的引擎部分 编译文件engines/author/
Android.mk
Android的Author适配器 编译文件
android/author/
Android.mk。
libopencoreauthor.so中主要内容为各个文件编码器和文件组成器PVAuthor的核心功能在engines/author/
Android.mk中而
android/author/
Android.mk是在PVAuthor之上构建的一个为
Android使用的媒体记录器。
OpenCore Common lib libopencorecommon.soPVMFPlayer EngineAndroid AuthormediarecorderCamera InputAudio InputAuthorDriverPVAuthorlibopencoreauthor.so 组成部分 作者核心引擎 适配器PVAuthor Camera输入环节 Audio输出环节 pvauthorengineinterfacepvauthorenginefactorypvauthorengine 目录为OpenCore中的engines/author/是Author引擎目录其主要包含include和src两个目录头文件中的pvauthorenginefactory.h和pvauthorengineinterface.h两个文件为接口源文件为主要的具体实现pvauthorengine.cpp。
Author Engine的类结构 PVMediaRecorderandroid_camera_inputISurfaceActive Source NodeMediaFileAudio DataVideo DataPVAuthorActive Source NodePV Author EngineCameraAudioInputandroid_audio_inputPVAuthor 的结构活动的数据源Node将主动写下一个环节。
PVAuthor 的类的结构GetPVAuthorStateAddDataSourceSelectComposerAddMediaTrackAddDataSinkOpenCloseInitResetStartPauseResumeStop-pvauthorengineinterfacepvauthorenginefactoryPVAuthorPVAuthorDriverAndroidAudioInputAndroidCameraInputPVMediaRecorder Stagefright是
Android Eclair中新增的一个多媒体的实现。
它是一个轻量级的多媒体实现。
Stagefright头文件frameworks/base/media/libstagefright/include/Stagefright的实现frameworks/base/media/libstagefright/
上一篇:
Android基础知识讲解
下一篇:
让我掉下眼泪的