http | java 直接播放 http 响应流的内容
http | java 直接播放 http 响应流的内容
2023-05-08 14:26:48
引言
之前帮其他人写一个简单的 java 本地词典程序,其中包括一个阅读功能,选中单词,阅读单词。开始的想法是直接调用 Baidu Fanyi 的接口。
最简单、容易理解的实现发送请求下载 mp3 文件到本地,播放本地的 mp3 文件。更好的方式是直接转换流,就省去的下载的这个过程
1 | 发送请求 - 下载mp3文件到本地 - 播放 mp3 |
其实,这个功能有点偏题了,因为播放必须要联网,和本地这个有冲突。因为想要看看如何实现,就把这个功能添加上去了
java 发送 http 请求,直接播放响应
- 发送请求,获取响应流
- 创建 Player 类,并传入一个响应流
- 播放
http 请求使用了 JDK 原声的 Http Client 相关的类,播放 mp3 文件使用到了一个第三方库 jlayer(Maven地址)
代码
依赖
1 | <dependency> |
HTTPPlayer类
1 | import javazoom.jl.player.Player; |
测试
1 | HTTPPlayer player = new HTTPPlayer(); |
简单封装一下
1 | public static void playSound(String word, String language) { |
在实际的使用过程中,偶尔会出现服务错误相关的状态码,不清楚是否是 baidu 检测到了是脚本发送的。
做了一个简单的解决方案,如果发送错误,就递归调用一下。
优点
和 “发送请求保存文件到本地,在进行播放” 相比的优点
- 资源利用效率:该代码通过使用缓冲输入流(BufferedInputStream),直接将HTTP响应的输入流与播放器关联,实现了边接收数据边播放的功能。相比先将文件保存到本地再进行播放,避免了在磁盘上进行中间存储的开销,节省了存储空间和I/O操作。
- 响应速度:由于不需要等待整个文件下载完成后再进行播放,而是边下载边播放,可以更快地开始播放音频。这对于实时性要求较高的应用场景,如在线音乐或音频直播等,能够提供更好的用户体验。
- 简洁性和便利性:代码将请求、下载和播放的逻辑整合在一起,使得使用者可以更方便地使用HTTPPlayer类进行音频播放。相比手动发送请求保存文件到本地,再进行播放的方式,代码更加简洁、易于理解和维护。