Потоковая передача на Android MediaPlayer - программирование
Подтвердить что ты не робот

Потоковая передача на 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? Какую стратегию я должен использовать здесь?

4b9b3361

Ответ 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 сохранялся потребляя его без жалобы. Для воспроизведения звука требуется только один запрос и ответ. В итоге он работал очень хорошо.