Как транслировать аутентифицированный контент с MediaPlayer на Android - PullRequest
14 голосов
/ 29 мая 2010

Я видел довольно много постов, задающих этот вопрос на SO, но, похоже, нет однозначного ответа (или хотя бы ответа, который мне нравится!)

У меня есть контент, защищенный базовой аутентификацией (имя пользователя / пароль) - я могу нормально его загружать, используя различные условия загрузки HTTP, но я не могу разобраться, как сказать медиаплееру для его потоковой передачи (и предоставить аутентификацию). Я видел один пост, в котором говорилось, что это невозможно, поскольку MediaPlayer - это весь нативный код, который не похож на Authenticator.

Существует множество примеров того, как сначала загрузить в кэшированную копию, а затем воспроизвести ее, но ... Это отстой (и файлы могут быть сотнями МБ). Я видел по крайней мере одно предложение загрузить его небольшими порциями, а затем запустить и остановить воспроизведение (перенаправление на новый файл), но такого рода отстой также и, поскольку (я предполагаю) будет заикание (хотя я не пробовал его )

Лучшая идея, которая у меня есть на данный момент, - начать загрузку в файл кэша, а затем, когда он «заполнится полностью», запустить воспроизведение, а я продолжу заполнять файл .... Я надеюсь , что это работает (но опять же, не пробовал).

Я что-то упускаю из виду? Это так больно, что все различные части практически работают, и я как-то убедил себя, что должен быть способ для потоковой передачи защищенного контента (или если он требует уже установленного и квалифицированного InputStream), но это не приносит радости.

Кстати, я парень из Mac / iPhone и новичок в Android, поэтому я все еще немного борюсь с изучением Java ... Извините, если я упускаю что-то очевидное.

Ответы [ 3 ]

2 голосов
/ 08 декабря 2010

Если вы управляете сервером, один из вариантов может состоять в том, чтобы изменить его так, чтобы при аутентификации можно было генерировать временный случайный URL-адрес для контента, а затем передавать его в потоковом режиме. Будут ли функции потоковой передачи принимать URL-адрес, содержащий параметры сценария?

Для того, чтобы сделать что-то полностью на телефоне, другим вариантом было бы написать тривиальный прокси-сервер типа http в виде java или собственного кода и запустить его в фоновом потоке. Вместо того, чтобы указывать медиаплеер на сервер, вы должны указать свой прокси на устройстве. Прокси-сервер будет передавать запросы на удаленный сервер при обработке аутентификации.

1 голос
/ 31 марта 2011

Один из подходов - загрузить данные самостоятельно, декодировать их (из ??? в PCM) и использовать AudioTrack для воспроизведения PCM. Хитрость в декодировании. В каком формате кодируется поток?

Необработанные декодеры для распространенных протоколов доступны на Android, но в библиотеках C. Поэтому вам, возможно, придется добавить слой JNI для декодирования, опять же, в зависимости от того, в какой кодировке находится ваш поток.

0 голосов
/ 02 сентября 2014

У меня была такая же проблема, и я решил ее, поместив учетные данные в URL. Он официально не поддерживается для HTTP, но большинство веб-клиентов поддерживают его.

Следующий код основан на этом руководстве: http://www.coderzheaven.com/2012/08/14/stream-audio-android/

    try {
        // You can use HTTPS or HTTP as protocol.
        String myURL = "https://example.com/song.mp3";

        mp.reset();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setOnPreparedListener(this);
        mp.setOnErrorListener(this);

        // These are the two lines, doing the magic ;) It transforms it to a url like this: https://user:password@example.com/song.mp3
        UsernamePasswordCredentials credentials = connHelper.getCredetials();
        myURL = myURL.replace("://", "://" + URLEncoder.encode(credentials.getUserName(), "UTF-8") + ":" + URLEncoder.encode(credentials.getPassword(), "UTF-8") + "@");

        mp.setDataSource(myURL);
        mp.prepareAsync();
        mp.setOnCompletionListener(this);
    } catch (Exception e) {
        Log.e("StreamAudioDemo", e.getMessage());
    }

ПРИМЕЧАНИЕ: Используя здесь URLEncoder, мы хотим устранить такие проблемы, как: Если имя пользователя или пароль содержит двоеточие или @.

ПРИМЕЧАНИЕ2: Это может или не может работать для вас, в зависимости от вашего сервера. Если вы столкнулись с этой проблемой, я советую вам взглянуть на нее: Почему браузеры не отправляют заголовок аутентификации, когда учетные данные указаны в URL?

...