可以从MediaPlayer的流中检索数据吗?

时间:2012-03-16 22:58:35

标签: android media-player

如果我要将某种媒体流式传输到MediaPlayer,有没有什么方法可以在播放之前/之后复制它?例如,如果我要播放YouTube剪辑,是否可以在播放时保存该剪辑?

编辑:
(Ocelot的回答让我意识到这个问题是如何本地化的。)

我要做的是复制正在进行的MediaPlayer流(无论是youtube还是音乐流)。我希望能够在新流开始和结束时收到通知。到目前为止,我发现的唯一一件事(对于后者)甚至可以远程关闭广播字符串ACTION_AUDIO_BECOMING_NOISY,但这并不能满足我的需要。我有办法做到这一点吗?

3 个答案:

答案 0 :(得分:1)

我没有对此进行过测试,看起来有点工作,但这是我会尝试的:

  1. 创建Socket的子类。在这个类中,您可以处理所有字节读取,并在本地保存流或使用它做任何事情

  2. 创建您自己的内容提供程序,您可以使用它以您自己的格式将URI传递到您的媒体播放器。示例:mystream://youtube.com/watch?v=3Rhy37u

  3. 在您的内容提供商中,覆盖openFile方法并在其中打开您自己的套接字,然后create a ParcelFileDescriptor with it

  4. 现在,只需将新格式的网址传递给您的媒体播放器即可让所有流都通过您的套接字,您可以在其中保存数据。

答案 1 :(得分:0)

一种方法是首先找出视频在服务器中的位置,以便在youtube中使用简单的正则表达式:

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

您可以检索视频的网址,然后像

一样下载
    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。

答案 2 :(得分:0)

@zrgiu

我尝试使用此解决方案,但MediaPlayer从URI检索FileDescriptor,遗憾的是没有http URL可以像这样传递。

我还找到了另一个解决方案,它建议在您的设备上创建一个本地ProxyServer来提供来自互联网的文件,也应该可以保存通过代理传输的文件。