Можно ли извлечь данные из потока MediaPlayer? - PullRequest
4 голосов
/ 17 марта 2012

Если бы мне нужно было передать какой-то тип мультимедиа на MediaPlayer, есть ли способ скопировать его до / как / после воспроизведения?Например, если бы мне пришлось транслировать клип на YouTube, можно ли сохранить этот клип во время его воспроизведения?

Редактировать:
(ответ Оцелота заставил меня понять, насколько локализован этот вопрос).

Я хочу скопировать поток MediaPlayer, который уже выполняется (будь то YouTube или музыкальный поток).Я хочу иметь возможность получать уведомления, когда начинается и заканчивается новый поток.Пока единственное, что я обнаружил (для последнего), что оно даже удаленно закрывает строку широковещания ACTION_AUDIO_BECOMING_NOISY , но на самом деле ничего не делает для того, что мне нужно.Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 26 марта 2012

Я не проверял это, и, похоже, довольно много работы, но вот что я бы попробовал:

  1. Создать подкласс Socket. В этом классе вы можете обрабатывать все чтения байтов и сохранять поток локально или делать с ним все, что захотите

  2. Создайте своего собственного провайдера контента, который вы можете использовать для передачи URI в ваш медиаплеер в своем собственном формате. Пример: mystream://youtube.com/watch?v=3Rhy37u

  3. В вашем контент-провайдере переопределите метод openFile и в нем откройте собственный сокет и создайте ParcelFileDescriptor с ним .

Теперь простая передача URL-адреса нового формата медиаплееру должна заставить все потоки проходить через ваш сокет, где вы сможете сохранить свои данные.

0 голосов
/ 28 февраля 2015

@ zrgiu

Я пытался использовать это решение, но MediaPlayer извлекает FileDescriptor из URI, поэтому, к сожалению, http-адрес не может быть передан таким образом.

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

0 голосов
/ 21 марта 2012

Один из способов - сначала узнать, где находится видео на сервере, например, в YouTube, с помощью простого регулярного выражения, например:

Regex("(?<=&t=)[^&]*").Match(file).Value;

Вы можете получить URL-адрес видео и затем загрузить его как * 1004.*

    public static void Download(string videoID, string newFilePath)
    {
        WebClient wc = new WebClient();
        string file = wc.DownloadString(string.Format("http://www.youtube.com/watch?v={0}", videoID));
        string t = new Regex("(?<=&t=)[^&]*").Match(file).Value;
        wc.DownloadFile(string.Format("http://www.youtube.com/get_video?t={0}=&video_id={1}",t,videoID), newFilePath);

}

это код на C #, но вы можете легко преобразовать его в Java.

...