Потоковая передача Android с сервера icecast получить информацию о треке

У меня есть поток с загружаемого сервера icecast, и я могу получить информацию из заголовков, выполнив следующие действия:

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

    int pos=1;
    String x;
    String y;

в то время как (cn.getHeaderField (pos)! = null) {x = cn.getHeaderFieldKey (pos); y = cn.getHeaderField (x); Log.e (":::::", "" + x + ":" + y); pos ++; }

Когда я это сделаю, все заголовки, которые я получаю, отображаются как:

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-жанр: классический , New Age, Ambient icy-name: RadioStation Пример icy-private: 0 icy-pub: 1 icy-url: http://exampleradio.com сервер: Icecast 2.3.2 cache-control: no-cache

Однако, если я открываю свой поток в mplayer, я получаю:

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

и при каждом изменении песни отправляется новая информация о треке, которая появляется в mplayer таким же образом.

В android, когда я пытаюсь прочитать ледяную информацию, все, что мне возвращается, равно нулю. Также, как мне получить новую информацию из заголовков во время буферизации из потока? Потому что даже если я попытаюсь прочитать заголовок того, что, как я знаю, существует во время буферизации, например:

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

Все, что мне вернули, - null.

Надеюсь, это имеет смысл, я могу опубликовать дополнительный код по запросу.


person stealthcopter    schedule 28.04.2010    source источник


Ответы (2)


Я понимаю, что это старый вопрос, но для тех, кто сталкивается с этой проблемой, я использую этот проект: http://code.google.com/p/streamscraper/, чтобы получить информацию о треке из потока icecast. Использую на андроиде и пока работает как положено.

person whiskeyjoe    schedule 12.10.2011

Все, что вам нужно, это setDataSource () и передать URL-адрес в виде String, затем вы должны prepareAsync () и с mp.setOnPreparedListener (this); и т.д. вы заметите, когда MediaPlayer завершит буферизацию, тогда все, что вам нужно сделать, это mp.start (); P.S .: Не забудьте запустить mp.stop, mp.reset и mp.release после уничтожения приложения. ;) Я все еще думаю о способе чтения информации ICY ... Я должен либо создать свой собственный механизм буферизации и написать буферный файл (инициализировать MediaPlayer с помощью FileDescriptor), либо время от времени создавать отдельное соединение, чтобы проверить ICY info отмечает и закрывает соединение ... Есть идеи лучше?

person iganev    schedule 19.11.2010
comment
MediaPlayer не поддерживает или, по крайней мере, не поддерживает поток, который я использовал. - person stealthcopter; 19.11.2010