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

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

...

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

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

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

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

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

Ответ 2

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

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