首页 文章

Android - 播放仍在下载的歌曲

提问于
浏览
-1

我正在创建一个应用程序,其中多个设备可以在局域网中相互连接,并从彼此的设备播放歌曲 .

现在,当设备A从设备B请求歌曲时,B通过套接字将歌曲文件发送回A.歌曲完成下载后,A开始使用 MediaPlayer 播放 .

现在问题在于,即使在高速局域网上,完成取出歌曲也需要几秒钟,因此在选择歌曲和实际开始播放之间存在明显的延迟 .

我想找到一种方法来播放一首仍在下载的歌曲 . 以下是我找到的一些可能的解决方案,但由于某些原因无法探索:

  • MediaPlayer 文档中,我注意到一个带有MediaDataSource实现的构造函数,允许我在MediaPlayer需要时手动返回部分媒体文件,这样我就可以延迟返回一个字节直到它完成下载(如果它没有't finished downloading already), effectively acting like a 908994 action. It seemed like a solution but unfortunately, my app' s minSdk是设置为16和 MediaDataSource 仅适用于23及以上,所以我无法尝试 .

  • 一个选项是使用 MediaPlayersetDataSource(FileDescriptor fd, long offset, long length) 方法 . 这将允许我告诉MediaPlayer只播放歌曲的某个字节 . 这样,我可以等待文件的更多部分(或整个文件)变得可用,然后使用 setNextMediaPlayer() 并传入一个新的MediaPlayer对象,准备整首歌曲,并使其寻找到前一个点媒体播放器对象将停止播放,以便's a seamless transition. But there'的另一个问题 . 我需要能够计算在第一个未完成的媒体播放器对象的最后指定字节处达到的毫秒位置 . 否则,我不知道寻找下一个媒体播放器对象的位置,以便获得无缝过渡 . 对于有损格式,这种计算似乎不可能 .

  • 我只是在做假设 . 我注意到 setDataSource() 需要一个Uri . 如果该Uri指向手机上的文件,则媒体播放器只会加载整个文件 . 但是,如果Uri指向互联网上需要流式传输的音频文件,它会在互联网上找到一首歌吗?这一次我一直在使用套接字并手动将文件从一个设备复制到另一个设备,所以我不知道这是如何工作的 . 任何人都可以解释这是否可能?

实际上,我没有探索将歌曲从一个设备“流式传输”到另一个设备的方法 . 这是因为我希望将歌曲缓存在设备B上,以便稍后如果我切换到另一首歌然后从设备A返回之前播放的歌曲,它就不应该再次播放它 . 它应该只播放缓存的副本 .

  • 最后,我遇到了 ExoPlayer . 它似乎提供了大量的自定义 . 看起来我可以自定义它的类来处理所有的缓冲 . 但是文档和示例很少,对我来说太复杂了 . 我不知道怎么把它拉下来 . 这个解决方案对我想达到的目标来说太复杂了吗?

希望有人能指出我在这里正确的方向 .

1 回答

  • 0

    结束使用这里的答案:

    MediaPlayer stutters at start of mp3 playback

    此解决方案设置MediaPlayer可用于流式传输文件的本地服务器 . 服务器只在这些字节可用时向MediaPlayer发送字节 . 否则,它会阻塞,直到有更多字节可用 . 因此,MediaPlayer将其缓冲,就好像它是来自Web服务器的文件一样 .

    我接受了该答案中提供的同一课程,并根据我的情况进行了调整 .

相关问题