我正在用安卓的MediaPlayer
播放MP3文件,这些文件是用DownloadManager
同时从互联网上下载的。我知道MediaPlayer
具有直接流式传输的能力,但我不想使用它:
从文件下载和同步流式传输的明显优势是,通过这种方式,文件将被存储,然后在本地可用。
MediaPlayer
也会开始播放。(顺便说一下,我的问题不是不能让MediaPlayer
播放。)MediaPlayer
到达刚开始播放时下载状态的位置时,它会停止并调用onCompletion
。(澄清:假设我开始播放时该文件的下载率为12%。当播放器到达12%时,它stops.)DownloadManager
.将某些东西附加到MP3文件时,不会调用OnBufferingUpdateListener.onBufferingUpdate(...)
所以问题是:我如何同时下载一个音频文件到文件系统并播放它?(如果有区别,安卓4+就足够了。)
发布于 2012-12-14 03:04:41
我假设您将MediaPlayer指向该文件。在这种情况下,我认为它不支持流,它可能会提前检查文件的大小等,所以它不会随着更多的文件进入而自我更新。
您必须将其指向可与流一起使用的内容源,例如HTTP。我刚刚检查了"ES文件资源管理器“是如何做到这一点的(使用LogCat) -当你点击远程文件共享中的一个视频文件时,它会打开一个本地HTTP服务器,并向MediaPlayer发送一个HTTP Uri到它的本地服务器,其中也包括远程路径。
当它通过超文本传输协议获得请求时,本地服务器开始从远程位置读取文件,并通过超文本传输协议在本地将其提供给MediaPlayer。您可能也可以这样做,除了通过HTTP提供它之外,还可以将它保存到磁盘。
发布于 2016-03-16 18:41:42
它帮助了我,我希望也能帮助别人。
播放器下载并播放音乐。
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();
下载文件后:
mMediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/Folder/" + TITLE + ".mp3");
发布于 2018-05-21 16:06:05
我也有同样的问题。当然,当我同时使用setDataSource(video_uri)
和aCustomDownload(video_uri)
时,它可以保存和播放,但它浪费了带宽。
我试着对setDataSource
做一个假的屏蔽FileDescriptor(FileInputStream,( LocalSocket),还有其他的方法,但是都失败了。
所以我找到了这个解决方案,VideoCache。
通过http代理服务器
http://127.0.0.1:xxxx/url_encode('your video url')
。127.0.0.1
的服务器。所以你可以setDataSource('http://127.0.0.1:xxxx/your video's encode url')
android.intent.action.SEND
或其他made中使用它这是一个完美的解决方案。
注意:您必须关闭缓存限制。否则,当高速缓存大小为512MB(默认)时,VideoCache将清除所有数据。
https://stackoverflow.com/questions/13863724
复制相似问题