9

我必须修改 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 中的代码吗?

4

2 回答 2

8

您将无法替换原始库,因为当您尝试替换时,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.

您可以通过以下方式了解更多信息:

出于安全原因,我很确定您也不能替换默认的类加载器。

但是,您可以做的是直接派生媒体播放器并让它加载您修改后的libstagefright-modified.so. 可能还有其他解决方案,没有看过媒体播放器的代码。

于 2013-12-03T07:16:28.907 回答
4

知道您要做的就是在数据到达 MediaPlayer 之前对其进行解析,因此我建议不要尝试更改 Android 库。正如 soulseekah 提到的,如果没有根设备,它就无法工作。还有其他选择,尽管它们都有缺点。

1) 如果您只针对最新版本(我相信 4.2 或更高版本),您可以查看添加到android.media包中的新类,例如MediaExtractorMediaCodec. 我对这些不是很熟悉,因为它们在我使用的硬件上不可用,但它们对于获取原始数据可能很有用。是使用它们播放视频的一个不错的示例。缺点是这些类在早期版本中不可用。

2) 另一种选择是在设备上放置一个本地代理。连接MediaPlayer到代理并自己向媒体服务器发出请求。有关更多信息,请参见我的答案。使用代理,您将看到通过的所有数据,让您有机会解析 ID3 标签。有一个缺点是您必须解析 TS 数据包以组合一个基本流(主要是完成解复用器的工作),但它适用于任何版本的 Android。TS流不难反汇编,ID3标签解析也不费时间,所以我认为这是一个合理的做法。

于 2013-12-04T04:07:56.170 回答