Android4.0.1中各个Player的功能

1. Android4.0.1中默认定义了4个真正的Player,具体情况如下:


  1. static sp<MediaPlayerBase> createPlayer(player_type playerType, void* cookie,  
  2.         notify_callback_f notifyFunc)  
  3. {  
  4.     sp<MediaPlayerBase> p;  
  5.     switch (playerType) {  
  6.         case SONIVOX_PLAYER:  
  7.             LOGV(" create MidiFile");  
  8.             p = new MidiFile();  
  9.             break;  
  10.         case STAGEFRIGHT_PLAYER:  
  11.             LOGV(" create StagefrightPlayer");  
  12.             p = new StagefrightPlayer;  
  13.             break;  
  14.         case NU_PLAYER:  
  15.             LOGV(" create NuPlayer");  
  16.             p = new NuPlayerDriver;  
  17.             break;  
  18.         case TEST_PLAYER:  
  19.             LOGV("Create Test Player stub");  
  20.             p = new TestPlayerStub();  
  21.             break;  
  22.         default:  
  23.             LOGE("Unknown player type: %d", playerType);  
  24.             return NULL;  
  25.     }  
  26.     if (p != NULL) {  
  27.         if (p->initCheck() == NO_ERROR) {  
  28.             p->setNotifyCallback(cookie, notifyFunc);  
  29.         } else {  
  30.             p.clear();  
  31.         }  
  32.     }  
  33.     if (p == NULL) {  
  34.         LOGE("Failed to create player object");  
  35.     }  
  36.     return p;  
  37. }  


2. 每个Player的专长是什么呢?

Player Type Feature Description
TEST_PLAYER url以test:开始的。如test:xxx
NU_PLAYER url以http://或https://开始的,且url以.m3u8结束或url中包含有m3u8字符串
SONIVOX_PLAYER 处理url中扩展名为:.mid,.midi,.smf,.xmf,.imy,.rtttl,.rtx,.ota的媒体文件
STAGEFRIGHT_PLAYER 它是一个大好人,前面三位不能处理的都交给它来处理,不知能力是否有如此强大

以上言论以代码为证,获取player type的代码如下:

[cpp]  view plain copy
  1. player_type getPlayerType(const char* url)  
  2. {  
  3.     if (TestPlayerStub::canBeUsed(url)) {  
  4.         return TEST_PLAYER;  
  5.     }  
  6.   
  7.     if (!strncasecmp("http://", url, 7)  
  8.             || !strncasecmp("https://", url, 8)) {  
  9.         size_t len = strlen(url);  
  10.         if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {  
  11.             return NU_PLAYER;  
  12.         }  
  13.   
  14.         if (strstr(url,"m3u8")) {  
  15.             return NU_PLAYER;  
  16.         }  
  17.     }  
  18.   
  19.     // use MidiFile for MIDI extensions   
  20.     int lenURL = strlen(url);  
  21.     for (int i = 0; i < NELEM(FILE_EXTS); ++i) {  
  22.         int len = strlen(FILE_EXTS[i].extension);  
  23.         int start = lenURL - len;  
  24.         if (start > 0) {  
  25.             if (!strncasecmp(url + start, FILE_EXTS[i].extension, len)) {  
  26.                 return FILE_EXTS[i].playertype;  
  27.             }  
  28.         }  
  29.     }  
  30.   
  31.     return getDefaultPlayerType();  
  32. }  
[cpp]  view plain copy
  1. player_type getPlayerType(const char* url)  
  2. {  
  3.     if (TestPlayerStub::canBeUsed(url)) {  
  4.         return TEST_PLAYER;  
  5.     }  
  6.   
  7.     if (!strncasecmp("http://", url, 7)  
  8.             || !strncasecmp("https://", url, 8)) {  
  9.         size_t len = strlen(url);  
  10.         if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {  
  11.             return NU_PLAYER;  
  12.         }  
  13.   
  14.         if (strstr(url,"m3u8")) {  
  15.             return NU_PLAYER;  
  16.         }  
  17.     }  
  18.   
  19.     // use MidiFile for MIDI extensions  
  20.     int lenURL = strlen(url);  
  21.     for (int i = 0; i < NELEM(FILE_EXTS); ++i) {  
  22.         int len = strlen(FILE_EXTS[i].extension);  
  23.         int start = lenURL - len;  
  24.         if (start > 0) {  
  25.             if (!strncasecmp(url + start, FILE_EXTS[i].extension, len)) {  
  26.                 return FILE_EXTS[i].playertype;  
  27.             }  
  28.         }  
  29.     }  
  30.   
  31.     return getDefaultPlayerType();  
  32. }  

如果你想增加自己的player,以上两个函数都需要修改。

现在对整个媒体系统基本上有一个清晰的框架了,就突发奇想,到底在StagefrightPlayer如何增加自己的硬件解码呢? 很好奇,想一探究竟...

你可能感兴趣的:(Android4.0.1中各个Player的功能)