默认情况下,android Gigerbread 2.3使用PV_Player(opencore库)。我找到了一个解决方案,它应该是修补系统build.prop文件,但我不想修补系统。我想使用Android媒体框架工作创建我自己的库,它将使用StageFright播放器。我知道libmediaplayerservice决定了玩家的选择。看看media framework
我想根据android框架创建库 -
但问题是libmedia不直接与libmediaplayerservice库交互,它不直接依赖于libmediaplayerservice库。因此它无法创建stagefright播放器。 Libmedia通过Binder IPC机制与libmediaplayerservice库进行通信。 我如何修补libmedia源库,以便它可以访问我的libmediaplayerservice库,并能够创建StageFright播放器以及StageFright记录器等的所有访问,而不是opencore库。
答案 0 :(得分:1)
我认为您无法修改媒体服务如何处理以及修补系统。由于媒体服务及其库位于系统分区上,因此您无法真正劫持jni负载。如果您运行的是非AOSP rom(如股票三星,HTC等),您将无法换掉库,因为库存ROM包含许多与专有库的链接。
答案 1 :(得分:1)
通过查看Android源代码,您提到的Binder机制应该查看方法'getMediaPlayerService()'并检查服务管理器如何处理媒体服务。如果您可以修补此方法并正确定义您的服务,那么您应该没问题。
IMediaDeathNotifier::getMediaPlayerService()
{
LOGV("getMediaPlayerService");
Mutex::Autolock _l(sServiceLock);
if (sMediaPlayerService.get() == 0) {
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder;
do {
binder = sm->getService(String16("media.player"));
if (binder != 0) {
break;
}
LOGW("Media player service not published, waiting...");
usleep(500000); // 0.5 s
} while(true);
if (sDeathNotifier == NULL) {
sDeathNotifier = new DeathNotifier();
}
binder->linkToDeath(sDeathNotifier);
sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
}
LOGE_IF(sMediaPlayerService == 0, "no media player service!?");
return sMediaPlayerService;
}
有问题的方法位于:
frameworks/base/media/libmedia/IMediaDeathNotifier.cpp
此外,通过调用
设置服务 void MediaPlayerService::instantiate() {
defaultServiceManager()->addService(
String16("media.player"), new MediaPlayerService());
}
可在以下网址找到:/frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp