Android从icecast服务器流媒体获取曲目信息

发布于 2024-08-30 19:19:14 字数 1085 浏览 12 评论 0原文

我有一个来自 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 冰冷-br : 64 冰音频信息:冰采样率=22050;冰比特率=64;冰通道=2 冰冷-br : 64 冰冷的描述:RadioStation 冰冷风格:古典、新世纪、氛围 icy-name :广播电台示例 冰冷私人:0 冰冷的酒吧:1 icy-url : http://exampleradio.com 服务器:Icecast 2.3.2 缓存控制:无缓存

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

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

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

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

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

我返回的所有内容都是空的。

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

I have a stream from an icecast server downloading, and I can grab the information in the headers by doing the following:

 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);
pos++;
}

When I do this all of the headers I receive are shown as:

content-type : audio/mpeg
icy-br : 64
ice-audio-info : ice-samplerate=22050;ice-bitrate=64;ice-channels=2
icy-br : 64
icy-description : RadioStation
icy-genre : Classical, New Age, Ambient
icy-name : RadioStation Example
icy-private : 0
icy-pub : 1
icy-url : http://exampleradio.com
server : Icecast 2.3.2
cache-control : no-cache

However if I open my stream in mplayer I get:

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

and with each time the song is changed, the new track information is sent appearing the same way in mplayer.

In android when I attempt to read the icy-info all I get returned is null. Also how would I go about retrieving the new information from the headers while I am buffering from the stream? Because even if I try to read the header of something I already know exists whilst buffering such as:

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

All I get returned is null.

I hope this makes sense, I can post more code on request.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

檐上三寸雪 2024-09-06 19:19:14

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

I realize this question is old, but for others who are facing this challenge, I am using this project: http://code.google.com/p/streamscraper/ to get track information from an icecast stream. I'm using it on android and so far it works as expected.

说好的呢 2024-09-06 19:19:14

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

All you need is to setDataSource() and pass the URL as a String, then you must prepareAsync() and with a mp.setOnPreparedListener(this); or etc. you will get noticed when the MediaPlayer is done buffering, then all you need to do is mp.start(); P.S.: Don't forget to mp.stop, mp.reset and mp.release upon destroying the application. ;) I'm still thinking of a way to read the ICY info... I must either make my own buffering mechanism and write a buffer file (init the MediaPlayer with FileDescriptor) or make a separate connection from time to time to check for ICY info tags and close the connection... Any better ideas anyone?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文