【问题标题】:Where/how does the Android MediaPlayer cache progressive downloadsAndroid MediaPlayer 在哪里/如何缓存渐进式下载
【发布时间】:2013-03-09 00:32:19
【问题描述】:

默认情况下,我需要知道 MediaPlayer 在通过渐进式下载“流式传输”音频/视频内容时缓存的位置/方式。

我们正在评估适用于 Android 媒体播放器应用的选项。值得关注的一项是防止内容被复制(在可能的范围内)。渐进式下载有很多好处,但我们需要确保采取合理的措施来保护媒体。我一定是在错误的地方进行了错误的搜索,因为我无法找到这方面的任何细节。我已经搜索了我们的测试设备的文件系统,试图从我们的测试渐进式下载应用程序中找到任何缓存的文件 - 无济于事(这对我们来说可能很好)。

【问题讨论】:

    标签: android media-player progressive-download


    【解决方案1】:

    在 Android 中,MediaPlayer 是一个抽象底层播放器引擎的顶级类。在MediaPlayer中,整体处理分为3大组件为

    MediaTrack ==> OMXCodec / ACodec ==> Sink
    

    其中MediaTrack 是一个特定于轨道的实现,它基于解析器引擎MediaExtractor

    MediaExtractor 使用抽象输入源的DataSource 进行初始化。对于渐进式下载,DataSource 的实现将是主要焦点,因为这将为下游组件提供缓冲区。由于Android平台在pull模式下工作,DataSource会控制提供数据的速率。

    在 AOSP 中,您可以参考 http://androidxref.com/4.2.2_r1/xref/frameworks/base/media/java/android/media/MediaPlayer.java#2132 中的示例实现。有关HTTPSource 实现的更多信息可以参考http://androidxref.com/4.2.2_r1/xref/frameworks/av/media/libstagefright/HTTPBase.cpp#47

    【讨论】:

    • 非常感谢您的回答。它确实为我指明了一些有用的方向。我在调试器中单步调试了 MediaPlayer 代码,试图深入了解 DataSource 的实现。不幸的是,当 MediaPlayer 最终调用原生版本的 setDataSource 时,我陷入了死胡同
    • 来自 JNI,即android_media_mediaplayer,调用通常会到达MediaPlayer.cpp。从MediaPlayer.cpp 开始,对player->setDataSource 的调用通常由播放器引擎实现,可以是StagefrightPlayerNuPlayer。在流式播放的情况下,调用将由NuPlayer 处理。
    • 再次感谢。不幸的是,我找不到关于 NuPlayer 或 StagefrightPlayer 的任何文档。如果我有时间设置一个 linux 开发平台并梳理 ASOP 代码,我会的。但是,不幸的是,我没有。我在一部干净的手机上安装了一个简单的媒体应用程序,通过渐进式下载流式传输 mp3,然后通过 DDMS 对文件系统进行了非常详尽的搜索。我没有找到可识别或可检索的音频副本。这使我得出结论,播放器要么缓存在内存中,要么以某种严重混淆的方式缓存到文件系统。这可能就足够了。
    • 我能够通过日志确认正在使用 AwesomePlayer。 Awesomeplayer 似乎使用 NuCachedSource2 作为其缓存 seen here。快速浏览NuCachedSource2 可以确认它正在使用页面缓存系统。感谢 Ganesh 引导我朝这个方向发展。
    • @ChuckSpencer 感谢您的确认。只是为了添加我之前的评论,我在RTSP 流的设置中观察了NuPlayer。但是,对于https 流媒体,我可以观察到与您提到的类似的路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2017-02-04
    • 2013-01-09
    • 1970-01-01
    相关资源
    最近更新 更多