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

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

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

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

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

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

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

Solutions Collecting From Web of "Потоковая передача с помощью Android MediaPlayer в SDK 8"

EDIT: Хорошо, теперь я верю, что у меня есть ответ!

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

Поэтому, если вы создаете собственные заголовки, замените «\ n» на «\ r \ n», и все будет в порядке.

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

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

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

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

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

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

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

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

Я что-то упустил?