代码目录:frameworks/av/media/libmediaplayerservice
# 目录中代码是 MediaPlayer 服务器端代码,实现了媒体播放,获取元数据,录像录音。
# 在 mediaserver 的 main_mediaserver.cpp 文件中添加了 MediaPlayerService服务:
AudioPlayerService::instantiate();
MediaPlayerService服务主要实现在MediaPlayerService.cpp中,是服务器端媒体操作的主接口,MediaPlayerService根据客户端请求的操作类型不同,创建不同的client代理,跟Client应用交互。
StagefrightPlayer.cpp是Android内置播放器,真正的播放器AwesomePlayer在framework/av/media/libstagefright/下。
MidiFile.cpp 是Android内置的midi文件类型的播放器
Android把MediaPlayerService获取媒体文件元数据的代码移到MetadataRetrieverClient.cpp和MidiMetadataRetriever.cpp中(Midi文件的元数据获取和普通媒体文件方式有所区别,所以单独提出了MidiMetadataRetriever.cpp)
Android把Recorder相关的代码提取出来放入了MediaRecorderClient.cpp中,这个类实际只起到了中转作用,具体的recorder有Android内置的StagefrightRecorder。
MediaplayerService工作流程相当简单
- 设置阶段:
client应用发起申请,MediaPlayerService创建对应的client代理
client调用setDataSource接口,MediaPlayerService根据文件内容后缀名或者url类型,选择相应的播放器
- 操作阶段:
client发送play命令,MediaPlayerService端调用相应播放器的播放命令
client发送metadata操作命令,MediaPlayerService端的 MetadataRetrieverClient调用不同的metadata获取插件来获取metadata
client发送recorder命令,MediaPlayerService端的MediaRecorderClient调用不同的recorder插件录音录像。
Midi格式介绍
Midi是一类比较特殊的媒体文件,普通的声音文件(*.wav文件)是计算机直接把声音信号的模拟信号经过取样——量化处理,变成与声音波形对应的数字信号,存储在文件中,而mid文件只是记录了演奏乐器的各种信息和指令,如用哪一种乐器,什么时候按某个键,力度怎么样等等,至于播放时发出的声音,那是通过播放软件或者音源的转换而成的。
Metadata
我的理解是除去媒体内容外,描述媒体文件的数据,包括类型,大小,日期,Author,duration,width,height,甚至thumbnail等都可算做元数据
文 | 力卉编程
网友评论