1

我有一个来自 icecast 服务器下载的流,我可以通过执行以下操作来获取标题中的信息:

 URLConnection cn = new URL(mediaUrl).openConnection();   
    cn.connect();   

    int pos=1;
    String x;
    String y;

while (cn.getHeaderField(pos) != null) { x=cn.getHeaderFieldKey(pos); y = cn.getHeaderField(x); Log.e(":::::",""+x+" : "+y); 正++;}

当我这样做时,我收到的所有标题都显示为:

内容类型:音频/mpeg icy-br:64 ice-audio-info:ice-samplerate=22050;ice-bitrate=64;ice-channels=2 icy-br:64 icy-description:RadioStation icy-genre:古典, New Age, Ambient icy-name : RadioStation 示例 icy-private : 0 icy-pub : 1 icy-url : http://exampleradio.com 服务器 : Icecast 2.3.2 缓存控制 : no-cache

但是,如果我在 mplayer 中打开我的流,我会得到:

 ICY Info: StreamTitle='artist - album - trackname' 

每次更改歌曲时,新的曲目信息都会以相同的方式在 mplayer 中发送。

在 android 中,当我尝试读取 icy-info 时,我返回的所有内容都是 null。另外,当我从流中缓冲时,我将如何从标头中检索新信息?因为即使我尝试在缓冲时读取我已经知道存在的内容的标题,例如:

  Log.e(getClass().getName()," "+cn.getHeaderField("icy-br"));

我得到的只是空值。

我希望这是有道理的,我可以根据要求发布更多代码。

4

2 回答 2

1

我意识到这个问题已经过时了,但对于面临这一挑战的其他人,我正在使用这个项目:http ://code.google.com/p/streamscraper/从冰播流中获取轨道信息。我在android上使用它,到目前为止它按预期工作。

于 2011-10-12T14:00:25.577 回答
0

您只需要 setDataSource() 并将 URL 作为字符串传递,然后您必须 prepareAsync() 和 mp.setOnPreparedListener(this); 等等。当 MediaPlayer 完成缓冲时你会注意到,那么你需要做的就是 mp.start(); PS:在销毁应用程序时不要忘记 mp.stop、mp.reset 和 mp.release。;) 我仍在考虑读取 ICY 信息的方法...我必须创建自己的缓冲机制并编写缓冲文件(使用 FileDescriptor 初始化 MediaPlayer)或不时建立单独的连接以检查ICY 信息标签并关闭连接...有更好的想法吗?

于 2010-11-19T08:40:50.777 回答