Потоковая передача на Android MediaPlayer

Я пытаюсь написать легкий HTTP сервер в своем приложении для feed динамически генерируемых MP3 данных на встроенный Android MediaPlayer . Мне не разрешено хранить мой контент на SD card .

Мои входные данные по существу имеют бесконечную длину. Я говорю MediaPlayer что его источник данных должен в основном быть чем-то вроде "http://localhost/myfile.mp3" . У меня есть простой сервер, который ждет, когда MediaPlayer выполнит этот запрос. Однако MediaPlayer не очень эффективен. Сначала он создает HTTP GET и пытается захватить весь файл. Это время, если мы попытаемся просто сбросить данные в socket чтобы мы попытались использовать заголовок HTTP Range для записи данных в куски. MediaPlayer не нравится это и не продолжает запрашивать последующие фрагменты.

Кто-нибудь успел потоковой передачи данных непосредственно в MediaPlayer ? Нужно ли мне вместо этого использовать RTSP или Shoutcast ? Я просто пропускаю критический HTTP header ? Какую стратегию я должен использовать здесь?

Solutions Collecting From Web of "Потоковая передача на Android MediaPlayer"

HTTP сервер действительно был размещен на самом телефоне. Это было очень просто: просто thread прослушивал сокет для HTTP GET запроса. Когда он получит HTTP запрос, он будет new socket , напишет некоторые HTTP заголовки и начнет сбрасывать аудиофайлы MP3 обратно в socket . Этот HTTP сервер ничего не сделал.

Android Media Player играл музыку, когда я транслировал ее. Media Player вел себя очень плохо, если его buffer воспроизведения был опустошен во время воспроизведения звука. Для меня было очень важно убедиться, что мой HTTP сервер продолжал записывать данные в этот socket . Я переместил байты в сокет в маленьких кусках (10 кБ). Заголовки моего HTTP ответа оказались такими:

 // Build response headers StringBuilder sb = new StringBuilder(); sb.append( "HTTP/1.1 200 OK\r\n"); sb.append( "Content-Type: audio/mpeg\r\n"); sb.append( "Connection: close\r\n" ); sb.append( "Accept-Ranges: bytes\r\n" ); sb.append( "Content-Length: " + totalFileSize + "\r\n" ); sb.append( "Content-Disposition: inline; filename=xxxxx.mp3\r\n\r\n"); 

Пока я поддерживал трубку, Android Media Player продолжал потреблять ее без жалобы. Для воспроизведения звука требуется только один запрос и ответ. В итоге он работал очень хорошо.