Потоковая передача на Android MediaPlayer - PullRequest
22 голосов
/ 24 марта 2010

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

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

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

1 Ответ

4 голосов
/ 22 июля 2014

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

...