Android 可能覆盖系统。所以应用程序中的库

Android 可能覆盖系统。所以应用程序中的库,android,android-ndk,android-mediaplayer,stagefright,Android,Android Ndk,Android Mediaplayer,Stagefright,我必须修改Android Media Player的Http实时流媒体实现。 该实现在stagefright库下进行 我认为这些库将编译成libstagefright.so,它应该是Android系统的一部分 我的问题是我是否对这个库做了一些更改并编译了一个新的libstagefright.so。 如果我在我的新应用程序中加载这个新的libstagefright.so并调用媒体播放器,它会使用我的新libstagefright.so中的代码吗?您将无法替换原始库,因为当您尝试从/system/

我必须修改Android Media Player的Http实时流媒体实现。 该实现在stagefright库下进行

我认为这些库将编译成libstagefright.so,它应该是Android系统的一部分

我的问题是我是否对这个库做了一些更改并编译了一个新的libstagefright.so。
如果我在我的新应用程序中加载这个新的libstagefright.so并调用媒体播放器,它会使用我的新libstagefright.so中的代码吗?

您将无法替换原始库,因为当您尝试从
/system/lib
中加载库。因此,除非您替换它(这在无根设备上是不可能的),否则您将无法加载自定义代码

默认情况下设置
LD\u库路径
。并从这些路径加载它(如果可用)。如果没有,则将搜索应用程序的
lib
目录;但不是相反

我曾在
libwebkit上尝试过这一点。因此
过去曾在各种主流设备上使用过,但没有成功地将其加载到
/system/lib

您可以通过查看以下内容了解更多信息:

  • doLoad
    从这里开始
  • findLibrary
    此处
我很确定,出于安全原因,您也不能替换默认的类加载器


不过,您可以直接使用媒体播放器加载修改后的
libstagefright modified.so
。可能还有其他的解决方案,没有看过Media Player的代码。

知道您只想在数据到达Media Player之前解析数据,我建议不要尝试更改Android库。正如soulseekah提到的,如果没有根设备,它将无法工作。还有其他选择,尽管它们都有缺点

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


2) 另一种选择是在设备上放置本地代理。将
MediaPlayer
连接到代理服务器,并亲自向媒体服务器发出请求。想了解更多关于这方面的信息。使用代理,您将看到所有通过的数据,从而有机会解析ID3标记。有一个缺点是,您必须解析TS数据包以将基本流放在一起(基本上是执行解复用器的工作),但它可以与任何版本的Android一起工作。TS流不难反汇编,ID3标记解析也不费时,所以我认为这是一种合理的方法。

soulseekah说得对,你不能只交换一个系统库。你到底想做什么?我想修改HLS实现,让它从TS流中读取ID3元数据。当前android media player的android实现不提供这些元数据的读取。您可以尝试向AOSP提交具有新功能的修补程序。谢谢您的回答。此外,如果我做一个简单的fork并加载我修改过的libstagefright-modified.so,如果我创建一个android.media.MediaPlayer,它会使用我的libstagefright-modified.so而不是系统libstagefright.so吗?我猜答案是否定的,libstageright.so是由libmedia_jni.so加载的,它是由android.media.media.player加载的,因此,我认为我必须以这种方式重新编译lib media_jni.so(将其更改为依赖于libstagefright modified.so),并重新编译android.media.MediaPlayer和其他一些相关库,以便使用libstagefright modified中的新函数。那么?是的,您需要一个独立的fork,将所有依赖代码更改为依赖libstagefright-modified.so。此外,您需要重构所有名称和包,并查找冲突。有关类似的想法,请参阅。感谢方法1),使用MediaExtractor.setDatasource(“),我认为应用程序必须再次下载整个视频文件才能读取元数据?因此,这意味着下载视频文件两次,这可能不满足。对于方法2),由于HLS是一个包含.ts文件列表的.m3u8,因此在我的本地代理中,如果它代理.m3u8文件和其他.ts文件,它应该很好,为什么它必须解析ts包ets需要整合一个基本流吗?感谢这对1的支持,我相信你不需要下载两次。你根本不需要使用MediaPlayer。相反,你的工作是将字节缓冲区从MediaExtractor传递到适当的编解码器,但你显然可以事先解析它。对于2,我只是说你必须要eal与原始TS流。您要解析的标记将被分解为TS数据包的有效负载,这意味着您必须提取这些有效负载并将原始媒体流组合在一起,然后才有意义。感谢您提供的信息。对于1,正如您提到的,我将根本不使用MediaPlayer,因此我必须实现自己的媒体播放器包括HLS实现——解析提要,从正确的文件中获取TS字节,等等。之后,我可以将视频传递给MediaCodec来播放视频。这是正确的方法吗?看起来要重新实现HLSA需要做很多工作,我说过,我对这些类不太熟悉。我相信MediaExtractor可以完成多路复用对于您来说(包括提取TS数据包的有效负载),这意味着其余部分应该不会非常困难。如果真是这样,您需要下载m3u8并使用MediaExtraction/MediaCodec算法,如示例链接中所示,用于每个连续TS流。我想您会的