Потоковая передача с помощью Android MediaPlayer в SDK 8

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

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


person Dharwin    schedule 17.11.2010    source источник
comment
Как играть в SHOUTcast?stackoverflow.com/a/8833346/265167   -  person Yaqub Ahmad    schedule 12.01.2012


Ответы (2)


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

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 запрашивает HTTP 1.0, а в эмуляторе — 1.1.

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

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

person Sasq    schedule 01.01.2011
comment
-1007 происходит со Stagefright, а не с Opencore. Кажется, Galaxy S v2.2 все еще использует OpenCore. - person Sasq; 01.01.2011

Потоковая передача MediaPlayer доступна, начиная с уровня API 1. Я снял демонстрационное видео RTSP. игрок полтора года назад. Клиенту Nagare уже два года.

Я что-то упустил здесь?

person Peter Knego    schedule 17.11.2010