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
。这导致客户端的mediaplayer抛出一个Error(1,-1007)
。
我正在努力找出为什么MediaPlayer无法连接到我的本地代理。它应该与连接原始源相同而没有元数据,这个方法是有效的。我通过我的代理转发所有来自外部源的标头,包括内容类型。
我会继续研究,但感觉已经走到了死胡同。如果需要更多细节,请让我知道。