我必须修改Android Media Player的Http Live Streaming实现。 该实施是在stagefright库下进行的 http://androidxref.com/4.0.4/xref/frameworks/base/media/libstagefright/httplive/LiveDataSource.cpp
我认为这些库将编译为libstagefright.so,它应该是Android系统的一部分。
我的问题是,如果我对这个库进行一些更改并编译一个新的libstagefright.so。 如果我在我的新应用程序中加载这个新的libstagefright.so并调用媒体播放器,它是否会使用我的新libstagefright.so中的代码?
答案 0 :(得分:7)
您将无法替换原始库,因为当您尝试loadLibrary
时,它将从/system/lib
内加载库。因此,除非您更换(在无根设备上无法替换),否则您将无法加载自定义代码。
https://github.com/android/platform_system_core/blob/66ed50af6870210ce013a5588a688434a5d48ee9/rootdir/init.environ.rc.in默认设置LD_LIBRARY_PATH
。如果可用,从这些路径加载它。如果没有,那么将搜索您的应用程序的lib
目录;但不是相反。
我过去曾尝试使用libwebkit.so
在各种主流设备上进行此操作,并且没有任何运气可以加载而不是/system/lib
中的那个。
您可以通过以下方式了解更多信息:
doLoad
来自https://android.googlesource.com/platform/libcore/+/41d00b744b7772f9302fdb94dddadb165b951220/luni/src/main/java/java/lang/Runtime.java findLibrary
此处http://developer.android.com/reference/dalvik/system/BaseDexClassLoader.html#findLibrary(java.lang.String) 出于安全原因,我很确定你无法替换默认的类加载器。
但是,您可以做的是直接分叉媒体播放器并加载修改后的libstagefright-modified.so
。可能还有其他解决方案,没有看过Media Player的代码。
答案 1 :(得分:4)
知道您要做的就是在数据到达MediaPlayer之前解析数据,我建议不要尝试更改Android库。正如soulseekah所提到的,如果没有一个有根设备,它就无法运作。还有其他选择,虽然它们都有缺点。
1)如果您只定位最新版本(我相信4.2或更高版本),您可以查看添加到android.media
包中的新类,例如MediaExtractor
和{{1} }。我对这些并不是很熟悉,因为它们与我工作的硬件不可用,但它们在获取原始数据时非常有用。 Here是使用它们播放视频的不错的样本。缺点是这些类在早期版本中不可用。
2)另一种选择是在设备上放置本地代理。将MediaCodec
连接到代理并自行向媒体服务器发出请求。 See my answer here了解更多信息。使用代理,您将看到所有数据,让您有机会解析ID3标记。有一个缺点是你必须解析TS数据包以组合一个基本流(基本上做分离器的工作),但它适用于任何版本的Android。 TS流不难拆解,而且ID3标签解析起来并不费时,所以我认为这是一种合理的方法。