Потоковая передача на Android MediaPlayer
Я пытаюсь написать легкий HTTP
сервер в моем приложении для feed
динамически генерируется MP3
данные во встроенный Android
MediaPlayer
, Мне не разрешено хранить мой контент на SD card
,
Мои входные данные по сути имеют бесконечную длину. я говорю MediaPlayer
что его источник данных должен быть в основном что-то вроде "http://localhost/myfile.mp3"
, Я установил простой сервер, который ждет MediaPlayer
сделать этот запрос. Тем не мение, MediaPlayer
не очень помогает Во-первых, это делает HTTP GET
и пытается захватить весь файл. Если мы попытаемся просто сбросить данные в socket
поэтому мы попытались использовать HTTP
Заголовок диапазона для записи данных кусками. MediaPlayer
не нравится это и не продолжает запрашивать последующие куски.
Кто-нибудь имел успех потоковой передачи данных непосредственно в MediaPlayer
? Нужно ли реализовать RTSP
или же Shoutcast
сервер вместо? Я просто скучаю по критическому HTTP header
? Какую стратегию я должен использовать здесь?
1 ответ
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
продолжал потреблять это без жалоб. Для воспроизведения аудио требуется только один запрос и ответ. В итоге все получилось довольно хорошо.