Потоковая передача с Android MediaPlayer в SDK 8 - PullRequest
13 голосов
/ 18 ноября 2010

SDK level 8 (Froyo) представил встроенную возможность MediaPlayer для подключения к потоковому источнику, такому как Shoutcast.Предыдущие версии SDK могли обходить обходные пути, такие как запуск локального прокси на устройстве (см. NPR ).

Я использовал тот же подход, что и NPR, и использую StreamProxy.Тем не менее, NPR сначала проверяет, является ли текущий запущенный SDK меньше 8. Если это так, он использует прокси.В противном случае он подключается напрямую.

Мой StreamProxy запрашивает метаданные с сервера Shoutcast, поэтому он не просто перенаправляет данные из Shoutcast на мой клиент.Вместо этого он анализирует метаданные и, соответственно, использует их и направляет только музыкальные данные.

При попытке использовать StreamProxy на уровне SDK 8 или выше MediaPlayer не может подготовиться.Мой StreamProxy получает соединение и принимает его, но после успешной записи строки состояния и заголовков клиенту при следующей записи выдается java.net.SocketException: Connection reset by peer.Это приводит к тому, что медиаплеер клиента выдает Error(1,-1007).

. Я пытаюсь выяснить, почему MediaPlayer не может подключиться к моему локальному прокси.Это должно быть то же самое, что и подключение к исходному источнику без метаданных, что работает .Я пересылаю все заголовки из внешнего источника через мой прокси-сервер, который включает тип контента.

Я буду продолжать изучать его, но я чувствую, что зашел в тупик.Дайте мне знать, если понадобится больше деталей.

Ответы [ 2 ]

12 голосов
/ 01 января 2011

РЕДАКТИРОВАТЬ: Хорошо, теперь я верю, что у меня есть ответ!

Stagefright является строгим, когда дело доходит до конца строки в HTTP-заголовке; Они должны быть CR, LF, а не просто LF, который работал раньше.

Так что если вы строите свои собственные заголовки, замените любые "\ n" на "\ r \ n" , и все будет в порядке.

(Если вы хотите проверить это сами, посмотрите на receive_line () в media / libstagefright / HTTPStream.cpp )

Теперь я могу транслировать shoutcast с метаданными на телефонах 2.2 / Stagefright ...

...

Я столкнулся с той же проблемой;

Сначала я попытался записать потоковые данные в файл фиксированной длины и обернуть - и воспроизвести его с помощью setLooping (true). Это приводит к сбоям при зацикливании MP3, хотя я извлекаю целые MP3-кадры и пытаюсь заполнить неравные байты в конце как 0xff, так и 0x00. Это может быть приемлемым решением, если у вас достаточно большой файл.

Затем я сделал прокси, который работает на моем Samsung Galaxy S (v2.2), но не в эмуляторе и, очевидно, не на Desire (не работает = ошибка -1007, как упомянуто выше). Один намек может заключаться в том, что Galaxy S Mediaplayer запрашивает HTTP1.0, тогда как в эмуляторе он равен 1.1.

Метод грубой силы будет состоять в том, чтобы открыть 2 потока параллельно, считывая метаданные из одного и передавая из другого;)

В любом случае, я также хочу услышать, повезло ли кому-то еще ...

1 голос
/ 18 ноября 2010

MediaPlayer потоковая передача доступна начиная с уровня API 1. Я работал с демо-проигрывателем RTSP-видео около полутора лет назад. Nagare клиенту shoutcast уже два года.

Я что-то здесь упускаю?

...