在SDK 8中使用Android MediaPlayer进行流式处理

Dha*_*win 14 proxy android stream media-player android-2.2-froyo

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无法连接到我的本地代理.它应该与没有元数据的原始源连接相同,这确实有效.我通过我的代理(包括内容类型)转发来自外部源的所有标头.

我会继续研究它,但我觉得我已经走到了尽头.如果需要更多细节,请告诉我.

Sas*_*asq 12

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

对于HTTP头中的行结尾,Stagefright是严格的; 它们必须是CR,LF,而不仅仅是早先工作的LF.

因此,如果您构建自己的标题,请将"\n"替换为"\ r \n",您应该没问题.

(如果您想检查自己这一点,看看receive_line()媒体/ libstagefright/HTTPStream.cpp)

我现在可以在2.2/Stagefright手机上使用Metadata流式传输shoutcast ...

...

我一直遇到同样的问题;

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

然后我做了代理的东西,它适用于我的三星Galaxy S(v2.2),但没有在模拟器中,显然不在欲望(不工作=如上所述的错误-1007).一个提示可能是Galaxy S Mediaplayer要求HTTP1.0,而在模拟器中为1.1.

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

无论如何,我还想听听其他人是否有更多运气...