当前位置: 首页 > article >正文

webSokect安卓和web适配的Bug 适用实时语音场景

❌BUG:

Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. 'https' is not allowed.

WebSocket 协议在创建连接时,规定其 URL 的协议头(scheme)必须是 ws(用于非加密的普通 WebSocket 连接,类似 HTTP 之于 HTTPS)或者 wss(用于加密的 WebSocket 连接,类似 HTTPS 之于 HTTP)

  • 在 Web 端,浏览器(如 Chrome、Firefox 等)有比较频繁的自动更新机制。这些更新通常会包含对各种网络协议包括 WebSocket 和常规 HTTP/HTTPS 链接兼容性的改进。当出现新的网络协议标准或者安全要求时,浏览器会快速更新以适应这些变化。所以,对于一些不符合严格规范但在实际使用中可能不会产生严重安全问题的情况(如某些对常规链接的模糊处理),浏览器可能会进行内部的兼容处理,而不要求开发者显式地去处理。

    只能接受 (wss://…, https://…)

  • 相比之下,手机端的应用更新(无论是系统应用还是第三方应用)相对没有那么及时。而且,手机操作系统为了确保安全性和稳定性,对应用的网络连接要求更加严格,不太可能自动对不符合规范的链接进行兼容处理。

    只能接受(wss://… )

    ❌BUG

recorder.ts:42 Uncaught (in promise) InvalidStateError: Cannot close a closed AudioContext

不能关闭一段已经关闭的音频,关闭前作判断

stop() {//停止音频录制过程并释放相关资源。
    if (this.mediaStream) {
      this.mediaStream.getTracks().forEach((track) => track.stop());
    }
    if (this.audioContext && !this.audioContextClosed) {
      this.audioContext.close();
      this.audioContextClosed = true
    }
  }

这种方式关闭音频录制,会导致:同一时间段如果有其它音频播放,声音会变小

缺点:

  • 资源释放的程度和方式

    • 你的方法会完全停止媒体流(mediaStream)中的所有音频轨道,通过调用每个轨道的stop方法来实现。这是一种比较彻底的停止方式,它会立即中断音频的录制过程,并且释放与媒体流相关的资源。
    • 同时,对于AudioContext,如果它存在且尚未关闭(通过audioContextClosed标志判断),会关闭AudioContext。关闭AudioContext会释放与之相关的所有音频节点、处理器以及连接等资源,包括可能正在处理或缓存的音频数据。这是一种比较 “重量级” 的资源释放操作,适用于完全结束音频相关的任务,并且在之后可能不会很快再次使用音频功能的场景。
  • 对其他音频的潜在影响

    • 由于这种方式会停止媒体流和关闭AudioContext,如果在同一环境下有其他音频正在播放或者依赖于这个AudioContext进行音频处理(例如混音、音频效果处理等),这些音频活动很可能会受到影响。例如,其他音频可能会突然停止播放,或者因为AudioContext被关闭而丢失一些音频处理状态,需要重新初始化才能继续正常工作

优化:

  • 暂时关闭麦克风音频输入

    可以通过获取媒体流中的音频轨道(MediaStreamTrack)并设置其enabled属性为false来暂时关闭麦克风。媒体流中的每个音频轨道对应麦克风的输入通道。例如:

       function disableMicrophone() {
         if (mediaStream && mediaStream.getAudioTracks().length > 0) {
           const audioTrack = mediaStream.getAudioTracks()[0];
           audioTrack.enabled = false;
         }
       }
  • 原理及为何不影响其他音频播放
    • 这种方式只是暂停了麦克风音频流进入AudioContext的通道,不会干扰已经在AudioContext或者其他独立音频播放系统中的其他音频。AudioContext中的其他音频节点(如用于播放背景音乐等的BufferSourceNode)以及外部独立的音频播放(例如通过<audio>标签或者其他AudioContext实例播放的音频)会继续正常工作,因为关闭麦克风音频轨道只是切断了这一个特定的输入源,而没有改变整个音频环境的其他部分。
  • 重新开启麦克风音频输入
    • 当需要重新开启麦克风时,将音频轨道的enabled属性设置回true即可。例如:
       function enableMicrophone() {
         if (mediaStream && mediaStream.getAudioTracks().length > 0) {
           const audioTrack = mediaStream.getAudioTracks()[0];
           audioTrack.enabled = true;
         }
       }

❌在http环境会出现一些录音权限不存在情况

this.audioContext.audioWorklet.addModule(moduleUrl);  // 报错addmodule不存在

为了用户的隐私,一般许多API(包括录音权限访问),只能在https才能够访问。为什么http://localhost可以访问原因是因为chrome对于localhost管理较松。

参考文章:https://modstart.com/p/r13f9t7tpnsuqbss


http://www.kler.cn/a/441411.html

相关文章:

  • 计算机的错误计算(二百二十二)
  • 使用 Tailwind CSS + PostCSS 实现响应式和可定制化的前端设计
  • uniapp 在线更新应用
  • 我谈区域偏心率
  • Flutter android debug 编译报错问题。插件编译报错
  • python操作mysql
  • 优化算法更新 | 基于WOA-CNN-BiLSTM的多步预测模型
  • C#/Winfrom -文件操作
  • Unity中展示当前时间
  • 使用 rvest 包快速抓取网页数据:从入门到精通
  • .NET6 WebAPI从基础到进阶--朝夕教育
  • Kubernetes Service 详解:如何轻松管理集群中的服务
  • 什么是MyBatis?
  • 【java-数据结构篇】揭秘 Java LinkedList:链表数据结构的 Java 实现原理与核心概念
  • [数据结构]无向图的深度优先非递归遍历
  • Python中cv2 (OpenCV, opencv-python)库的安装、使用方法demo最新详细教程
  • TGA历年最佳年度游戏
  • 靜態IP與DHCP的區別和用法
  • 基于springboot+vue实现的北部湾地区助农平台 (源码+L文+ppt)4-119
  • 网络隧道与代理
  • 医学统计软件的选择:SPSS与R语言的深度对比
  • 高并发-缓存预热
  • JavaScript期末复习日记1——基本语法操作01
  • Java开源位图(Bitmap)工具库和框架
  • vscode的copilot提示e.replace is not a function
  • Amazon Bedrock与AWS服务的无缝集成,如何打造智能化应用