眰恦.H 2023-04-21 11:12 采纳率: 42.9%
浏览 79
已结题

前端怎么响应二进制流啊,或者播放wav文件

问题:后台直接返回的bytes文件流前端无法播放,现在需要前端播放后台返回的音频,当前系统的音频并不是来自于自身
后端:
说明:当前系统A接受到用户请求后会将请求转发给系统B,系统B返回的是.wav的音频文件;不考虑将系统B的文件下载到本地然后返回url的方法

img


前端:
说明:前端需要响应后台的bytes音频流

img


F12:

img

  • 写回答

4条回答 默认 最新

  • 守时间的孤岛 2023-04-21 11:17
    关注

    该回答引用chatgpt:
    在前端中,可以通过 Audio 对象播放音频文件,而将二进制流转化为 Audio 对象的方法有很多种。以下是其中两种可能的方法:

    将二进制流转化为 Blob 对象,然后使用 URL.createObjectURL() 方法创建 URL,再将 URL 作为 Audio 对象的 src 属性的值,最后调用 play() 方法播放音频。

    fetch(url)
      .then(res => res.blob())
      .then(blob => {
        const audio = new Audio();
        audio.src = URL.createObjectURL(blob);
        audio.play();
      });
    
    
    

    直接将二进制流转化为 base64 编码的字符串,然后将该字符串作为 data URI 的一部分,最后将 data URI 赋给 Audio 对象的 src 属性。

    
    fetch(url)
      .then(res => res.arrayBuffer())
      .then(buffer => {
        const dataUri = 'data:audio/wav;base64,' + btoa(String.fromCharCode(...new Uint8Array(buffer)));
        const audio = new Audio();
        audio.src = dataUri;
        audio.play();
      });
    
    

    需要注意的是,这两种方法都可能存在兼容性问题,因此建议在不同浏览器中进行测试。另外,在使用第二种方法时,如果音频文件过大,可能会导致浏览器崩溃或卡顿,因此最好使用第一种方法

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月22日
  • 创建了问题 4月21日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题