在 SDK 8 中使用 Android MediaPlayer 进行流式传输

Posted

技术标签:

【中文标题】在 SDK 8 中使用 Android MediaPlayer 进行流式传输【英文标题】:Streaming with Android MediaPlayer in SDK 8 【发布时间】:2011-05-11 16:44:16 【问题描述】:

SDK 8 级 (Froyo) 引入了 MediaPlayer 连接到流媒体源的本机功能,例如 Shoutcast。以前的 SDK 版本能够解决问题,例如在设备上运行本地代理(请参阅 NPR)。

我采用了与 NPR 相同的方法,并且正在使用 StreamProxy。但是,NPR 首先检查当前运行的 SDK 是否小于 8。如果是,则使用代理。否则直接连接。

我的 StreamProxy 从 Shoutcast 服务器请求元数据,因此它不会简单地将数据从 Shoutcast 路由到我的客户端。相反,它解析出元数据并相应地使用它,并且只路由音乐数据。

在 SDK 8 级或更高级别尝试使用 StreamProxy 时,MediaPlayer 无法准备。我的 StreamProxy 接收连接并接受它,但在成功将状态行和标头写入客户端后,下一次写入会产生 java.net.SocketException: Connection reset by peer。这会导致客户端的媒体播放器抛出 Error(1,-1007)

我试图找出 MediaPlayer 无法连接到我的本地代理的原因。它应该与在没有元数据的情况下连接到原始源相同,确实有效。我正在通过我的代理转发来自外部源的所有标头,其中包括内容类型。

我会继续研究它,但我觉得我陷入了死胡同。如果需要更多详细信息,请告诉我。

【问题讨论】:

SHOUTcast怎么玩?***.com/a/8833346/265167 【参考方案1】:

编辑:好的,我现在相信我有答案了!

Stagefright 对 HTTP 标头中的行尾是严格的;它们必须是 CR、LF 而不仅仅是之前工作的 LF。

因此,如果您构建自己的标头,请将任何 "\n" 替换为 "\r\n" 就可以了。

(如果您想自己检查,请查看 media/libstagefright/HTTPStream.cpp 中的 receive_line()

我现在可以在 2.2/Stagefright 手机上使用元数据流式播放直播...

...

我也遇到了同样的问题;

首先,我尝试将流数据写入一个固定长度的文件并包装 - 并使用 setLooping(true) 播放它。这会在 MP3 循环时导致故障,即使我提取了整个 MP3 帧并尝试在末尾用 0xff 和 0x00 填充不均匀的字节。如果您有足够大的文件,这可能仍然是一个可接受的解决方案。

然后我做了代理,它可以在我的三星 Galaxy S (v2.2) 上运行,但不能在模拟器中运行,显然也不能在 Desire 上运行(如上所述,不工作 = 错误 -1007)。 一个提示可能是 Galaxy S Mediaplayer 要求 HTTP1.0,而在模拟器中它是 1.1。

蛮力方法是并行打开 2 个流,从一个读取元数据并从另一个流式传输;)

不管怎样,我也想听听其他人是否有更多的运气......

【讨论】:

-1007 发生在 Stagefright 而不是 Opencore。似乎 Galaxy S v2.2 仍然使用 OpenCore。【参考方案2】:

MediaPlayer 流从 API 级别 1 开始可用。大约一年半前,我做了一个演示 RTSP 视频播放器。 Nagareshoutcast 客户现在已经两岁了。

我错过了什么吗?

【讨论】:

在 2.2 之前从未直接连接到 Shoutcast 源。 SDK 8 引入了 StageFright (developer.android.com/sdk/…),一个新的媒体播放器框架。我会看看他们是如何在 Nagare 中实现它的,我很想看看它是否在 2.2 之前和 2.2 之后做同样的事情。 没问题!我自己并不完全理解不断变化的能力。然而,它确实让我想知道我是否可以以某种方式将我的媒体播放器设置为使用旧框架。现在正在调查。 看起来 Nagare 只是将音频流式传输到一个文件,该文件越来越大。它还导致 MediaPlayer 经常跳过。我不确定我是否可以使用该方法。

以上是关于在 SDK 8 中使用 Android MediaPlayer 进行流式传输的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 8.0 中未显示使用 parse sdk 的推送通知

推送通知未在Android 8.0中使用解析sdk显示

Android 相机意图 FileUriExposedException for SDK >= 24

Android 8或更高版本使用Firebase Performance SDK在Android Oreo上崩溃的应用程序

使用 Media Foundation SDK 进行直播

Android 关于解决MediaButton学习到的media控制流程