首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android媒体播放器:下载到文件和从文件流式传输

Android媒体播放器:下载到文件和从文件流式传输
EN

Stack Overflow用户
提问于 2012-12-14 00:03:41
回答 3查看 11.6K关注 0票数 22

我正在用安卓的MediaPlayer播放MP3文件,这些文件是用DownloadManager同时从互联网上下载的。我知道MediaPlayer具有直接流式传输的能力,但我不想使用它:

从文件下载和同步流式传输的明显优势是,通过这种方式,文件将被存储,然后在本地可用。

  • 这在原理上是可行的--即使文件没有完全下载,MediaPlayer也会开始播放。(顺便说一下,我的问题不是不能让MediaPlayer播放。)
  • 问题是,当MediaPlayer到达刚开始播放时下载状态的位置时,它会停止并调用onCompletion。(澄清:假设我开始播放时该文件的下载率为12%。当播放器到达12%时,它stops.)
  • Quick旁注:当通过DownloadManager.

将某些东西附加到MP3文件时,不会调用OnBufferingUpdateListener.onBufferingUpdate(...)

所以问题是:我如何同时下载一个音频文件到文件系统并播放它?(如果有区别,安卓4+就足够了。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-14 03:04:41

我假设您将MediaPlayer指向该文件。在这种情况下,我认为它不支持流,它可能会提前检查文件的大小等,所以它不会随着更多的文件进入而自我更新。

您必须将其指向可与流一起使用的内容源,例如HTTP。我刚刚检查了"ES文件资源管理器“是如何做到这一点的(使用LogCat) -当你点击远程文件共享中的一个视频文件时,它会打开一个本地HTTP服务器,并向MediaPlayer发送一个HTTP Uri到它的本地服务器,其中也包括远程路径。

当它通过超文本传输协议获得请求时,本地服务器开始从远程位置读取文件,并通过超文本传输协议在本地将其提供给MediaPlayer。您可能也可以这样做,除了通过HTTP提供它之外,还可以将它保存到磁盘。

票数 9
EN

Stack Overflow用户

发布于 2016-03-16 18:41:42

它帮助了我,我希望也能帮助别人。

播放器下载并播放音乐。

代码语言:javascript
复制
mMediaPlayer.setDataSource(DOWNLOAD_URL);

   File root = Environment.getExternalStorageDirectory();
   File dir = new File(root + "/Folder");
   if (!dir.exists()) {
        dir.mkdirs();

DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
            Uri downloadUri = Uri.parse(DOWNLOAD_URL);
            DownloadManager.Request request = new DownloadManager.Request(downloadUri);
            request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
            request.setAllowedOverRoaming(false);
            request.setTitle(TITLE);
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, TITLE);
            request.allowScanningByMediaScanner();

下载文件后:

代码语言:javascript
复制
mMediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/Folder/" + TITLE + ".mp3");
票数 5
EN

Stack Overflow用户

发布于 2018-05-21 16:06:05

我也有同样的问题。当然,当我同时使用setDataSource(video_uri)aCustomDownload(video_uri)时,它可以保存和播放,但它浪费了带宽。

我试着对setDataSource做一个假的屏蔽FileDescriptor(FileInputStream,( LocalSocket),还有其他的方法,但是都失败了。

所以我找到了这个解决方案,VideoCache

通过http代理服务器

  • 它,与@Oren的回答相同。它构建一个套接字本地http服务器,然后侦听有效的url,如http://127.0.0.1:xxxx/url_encode('your video url')
  • 当它得到一个有效的url时,它会创建一个套接字请求客户端来下载url,并将流发送到127.0.0.1的服务器。所以你可以setDataSource('http://127.0.0.1:xxxx/your video's encode url')
  • Use一次下载,保存和播放。而且它可以使成为具有多个活动(生命周期)加载的单一服务器,所以我可以在android.intent.action.SEND或其他made中使用它

这是一个完美的解决方案。

注意:您必须关闭缓存限制。否则,当高速缓存大小为512MB(默认)时,VideoCache将清除所有数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13863724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档