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

Я пытаюсь написать легкий HTTP сервер в моем приложении для feed динамически генерируется MP3 данные во встроенный AndroidMediaPlayer, Мне не разрешено хранить мой контент на 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 продолжал потреблять это без жалоб. Для воспроизведения аудио требуется только один запрос и ответ. В итоге все получилось довольно хорошо.

Другие вопросы по тегам