`
hyshucom
  • 浏览: 809389 次
文章分类
社区版块
存档分类
最新评论

android之MediaPlayer区别(android2.3与android4.0)

 
阅读更多
android之MediaPlayer区别
我们都知道MediaPlayer只是提供给上层调用的一种方式,正真做事的播放器是StagefrightPlayer ,PVPlayer,等等。
MediaPlayer从2.3开始就不用PVPlayer而改用StagefrightPlayer,但是PVPlayer的使能开关还是在的(也就是说你想用的时候改下宏你就可以用)。不过4.0以后你在android的源码中就再也看不到关于opencore的任何东西,也就是说PVPlayer将不复存在。
我打算从Mediaplayer调用的三个步骤来看mediaplayer发生了哪些改变。
1.setDataSource.
2.3的时候setDataSource被重载为三个函数:
status_t setDataSource( const char *url, const KeyedVector<String8, String8> *headers);
status_t setDataSource(int fd, int64_t offset, int64_t length);
status_t setDataSource(const sp<IMediaPlayer>& player);
4.0的时候setDataSource还是重载为三个函数:
status_t setDataSource( const char *url,const KeyedVector<String8, String8> *headers);
status_t setDataSource(int fd, int64_t offset, int64_t length);
status_t setDataSource(const sp<IStreamSource> &source);
显而易见的地方出来了,就是第三个函数。2.3的时候会在调用前两个setDataSource的里面调用第三哥setDataSource将MediaPlayerService创建的MediaPlayer(BnMediaPlayer)保存起来。而4.0里面将这个函数名改的更为人性化attachNewPlayer(const sp<IMediaPlayer>& player)。
而在setDataSource里面会sp<IMediaPlayer> player(service->create(getpid(), this, mAudioSessionId));来创建一个MediaPlayer(BnMediaPlayer)在4.0里面这个MediaPlayerService::create也有所不同,2.3是在create里面会调用Client(BnMediaPlayer)的setDataSource而4.0会在MediaPlayer(BnMediaPlayerClient)里面的setDataSource里面直接调用Client(BnMediaPlayer)的setDataSource。我觉得这个代码别人会跟容易理解。

在MediaPlayerService::Client::setDataSource里面你也可以看到不同。调用的getPlayerType(const char* url)当是流媒体类型时
if (!strncasecmp("http://", url, 7)
|| !strncasecmp("https://", url, 8)) {
size_t len = strlen(url);
if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
return NU_PLAYER;
}

if (strstr(url,"m3u8")) {
return NU_PLAYER;
}
}
这就是一个最大的变化,加上了对m3u8格式的支持所以加了个NU_PLAYER。

2.prepare会根据uri来创建一个DataSource,这个DataSource实际就是对uri所指定的这个文件的文件操作的封装,然后会创建一个MediaExtractor,同时将DataSource传进来作为文件源。MediaExtractor实际是一个文件解析器(Parser),如果看过ffmpeg的朋友都知道这个步骤都是类似的。当然这个MediaExtractor是有类型的,这个类型是根据DataSource里面的sniff函数来进行嗅探的(嗅探实际就是一个格式一个格式的尝试,看以哪个格式进行解析出来的结果最符合RegisterDefaultSniffers会注册一些类型的嗅探器)。如果你想添加某种文件类型,必须加上这种类型的嗅探器和文件解析器。文件解析器的作用就是对文件进行解析,包括文件中有几个track(一般都只有音频track和视频track或者还有字幕track)如果是音频track解析的过程中会在MetaData的类型前加audio/,视频的就加video/。4.0里面加上了对字幕的支持text/3gpp-tt。根据不同的track创建了不同的MediaSource,mVideoTrack保存的就是视频Track,mAudioTrack保存的是音频的Track,4.0里面mTextPlayer保存的是字幕track。当然 这些track数据都是压缩后的数据。要播放必须解码后得到原始数据,所以紧接着就是创建解码器。initVideoDecoder,initAudioDecoder就是创建了解码器。2.3里面创建解码器会软解的话会直接到某个软解的解码器如MP3Decoder,但是4.0就先到OMXCodec然后再到某个具体的解码器。
语言表达能力不行阿!就写这么多吧先。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics