語音相關-瀏覽器的自動播放策略研究和websocket研究

策略詳情在這里插入圖片描述

媒體參與度

在這里插入圖片描述

在這里插入圖片描述

AudioContext音頻API的實現

在這里插入圖片描述

new Audio音頻API的實現

在這里插入圖片描述

在這里插入圖片描述

相關實踐

網頁端

使用new Audio創建的音頻對象進行音頻播放的時候,如果用戶沒有與頁面進行交互,那么會報錯如下:

在這里插入圖片描述
使用AudioContext創建的對象播放音頻,不會報錯,但是會有警告如下:

在這里插入圖片描述

以上報錯都是在用戶與頁面交互前,創建音頻對象的時候報錯。我們通過websocket推送的音頻消息,只要用戶沒有與頁面有交互,都不會進行播放。直到用戶點擊了頁面,與頁面進行了交互,我們后續的websocket音頻消息才能正常播放。

釘釘桌面端

我們將我們的H5應用集成到釘釘桌面端,在網頁端出現的無交互不播放的問題,在釘釘桌面端不存在。
但是釘釘桌面端又存在其他問題。

(1)釘釘桌面端掛后臺定時任務放緩

由于收到節能機制影響,導致ws斷線重連的時候延遲到2分鐘后才發起重連
我們使用web worker可以繞開節能機制的影響

// timer-worker.js
let timers = {};self.onmessage = function(e) {const { type, id, delay } = e.data;switch(type) {case 'setInterval':timers[id] = setInterval(() => {postMessage({ type: 'interval', id });}, delay);break;case 'setTimeout':timers[id] = setTimeout(() => {postMessage({ type: 'timeout', id });delete timers[id];}, delay);break;case 'clearInterval':case 'clearTimeout':if (timers[id]) {clearInterval(timers[id]);clearTimeout(timers[id]);delete timers[id];}break;}
};
// timer-worker-class.js
class WorkerTimer {constructor() {this.worker = new Worker('resources/central/common/timer-worker.js');this.callbacks = {};this.currentId = 0;this.worker.onmessage = (e) => {const { type, id } = e.data;if (this.callbacks[id]) {this.callbacks[id]();if (type === 'timeout') {delete this.callbacks[id];}}};}setInterval(callback, delay) {const id = ++this.currentId;this.callbacks[id] = callback;this.worker.postMessage({ type: 'setInterval', id, delay });return id;}setTimeout(callback, delay) {const id = ++this.currentId;this.callbacks[id] = callback;this.worker.postMessage({ type: 'setTimeout', id, delay });return id;}clearInterval(id) {if (this.callbacks[id]) {this.worker.postMessage({ type: 'clearInterval', id });delete this.callbacks[id];}}clearTimeout(id) {if (this.callbacks[id]) {this.worker.postMessage({ type: 'clearTimeout', id });delete this.callbacks[id];}}}

項目代碼中使用如下

   workerTimer:new WorkerTimer(),vm.workerTimer.clearInterval(vm.heartbeatTimer);vm.workerTimer.setInterval

如上確實解決了定時任務放緩的問題。

(2)釘釘桌面端掛后臺聲音積壓和聲音丟失

釘釘桌面端最小化的時候,等待2分鐘后派單,無聲音播報,若立馬切前臺,會發出語音(如果派單了多條,那么此時會同時發出多條語音)。若等待時間較久,那么語音會丟失。
在這里插入圖片描述
且切換前臺的時候,websocket的onmessage回調方才執行。
問題在咨詢釘釘專家團隊,尚未解決。

(3)釘釘桌面端掛前臺websocket三分鐘一斷開

通過添加心跳協議解決該問題,同時保證斷線重連。websocket代碼如下:

 isConnecting:false,heartbeatInterval:30000,heartbeatTimer:null,reconnectInterval:300,setNoticeSocket(time){let vm = this;console.log("重連setNoticeSocket",vm.isConnecting,'new Date()',new Date(),'time-notifyConnetTime',time);if(vm.isConnecting){return;}if (typeof (WebSocket) == "undefined"){console.log("current web client is not support for websocket.")} else {let host = window.location.host;let scheme = window.location.protocol;let ws = 'ws://' + host;if (scheme.toLowerCase() == 'https:'){ws = 'wss://' + host;}let name= JSON.parse(localStorage.getItem('user')).user.replace(/\\/g,"*");let url = '/central/notify/refresh/'+name;console.log("重連newwebsocket前",new Date(),'vm.noticeSocket',vm.noticeSocket,'vm.noticeSocket.readyState',vm.noticeSocket && vm.noticeSocket.readyState)if(!vm.noticeSocket || (vm.noticeSocket && vm.noticeSocket.readyState === WebSocket.CLOSED)){console.log("重連newwebsocket",new Date(),'vm.noticeSocket.readyState',vm.noticeSocket && vm.noticeSocket.readyState,'time--notifyConnetTime',time)vm.isConnecting = true;vm.noticeSocket = new WebSocket(ws+url);vm.noticeSocket.onopen = function () {console.log("重連成功onopen",new Date())vm.isConnecting = false;vm.notifyConnetTime = 0;let data = {use:"FILTER",perspective:localStorage.getItem('perspective'),status: "0",id:'READ'};vm.noticeSocket.send(JSON.stringify(data))vm.heartbeatTimer && vm.workerTimer.clearInterval(vm.heartbeatTimer);vm.heartbeatTimer = vm.workerTimer.setInterval(() => {if (vm.noticeSocket.readyState === WebSocket.OPEN) {vm.noticeSocket.send(JSON.stringify({ type: 'heartbeat' }));}}, vm.heartbeatInterval);};vm.noticeSocket.onmessage = function (message) {let res = message.data;console.log("接收到ws消息----",res,new Date())if(!res) return;try{let data = JSON.parse(res);}catch(err){}};vm.noticeSocket.onclose = function (message) {vm.isConnecting = false;vm.heartbeatTimer && vm.workerTimer.clearInterval(vm.heartbeatTimer);vm.heartbeatTimer = null;vm.reconnetNotice('來自close');};vm.noticeSocket.onerror = function (message) {vm.isConnecting = false;vm.heartbeatTimer && vm.workerTimer.clearInterval(vm.heartbeatTimer);vm.heartbeatTimer = null;vm.noticeSocket.close();};}}},reconnetNotice(type){let vm  = this;console.log("reconnetNotice-發起重連type",type,vm.notifyConnetTime,'new Date()',new Date())// if(vm.notifyConnetTime<20){vm.workerTimer.setTimeout(()=>{vm.notifyConnetTime=vm.notifyConnetTime +1;console.log("重連執行--vm.notifyConnetTime",type,vm.notifyConnetTime,'date',new Date())vm.setNoticeSocket(vm.notifyConnetTime)},vm.reconnectInterval)// }return;},
(4)釘釘桌面端掛后臺websocket五分鐘一斷開

問題在咨詢釘釘專家團隊,尚未解決。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84450.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux操作系統網絡服務模塊一DHCP服務概述

前言&#xff1a; 在Linux網絡服務體系架構中&#xff0c;?DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;?? 作為核心服務之一&#xff0c;承擔著局域網內主機網絡參數動態分配的關鍵任務。其設計初衷是解決傳統手動配置IP地址的效率瓶頸與錯誤風…

FPGA基礎 -- Verilog語言要素之變量類型

Verilog 變量類型&#xff08;Variable Types&#xff09; 一、什么是變量類型&#xff1f; 在 Verilog 中&#xff0c;變量類型用于保存過程賦值結果&#xff08;由 always 或 initial 塊賦值&#xff09;&#xff0c;通常用于建模寄存器、狀態、計數器等“帶記憶”的硬件行為…

使用Haporxy搭建Web群集

目錄 一、案例分析 1.案例概述 2.案例前置知識點 2.1 HTTP請求 2.2 負載均衡常用調度算法 2.3常見的Web群集調度器 3.案例環境 3.1本案例環境 二、案例實施 1.搭建兩臺web服務器 2.安裝Haproxy 3.haproxy服務器配置 修改haproxy的配置文件 4.測試web群集 5.haproxy的日…

pikachu靶場通關筆記38 目錄遍歷(路徑遍歷)

目錄 一、目錄遍歷 二、源碼分析 三、目錄遍歷與文件包含 四、實戰滲透 1、進入靶場 2、目錄遍歷 &#xff08;1&#xff09;訪問ace.min.css &#xff08;2&#xff09;訪問fileinclude.php 本系列為《pikachu靶場通關筆記》滲透實戰&#xff0c;本文通過對目錄遍歷源…

現代C++:std::string全方位碾壓C字符串

在 C 中引入的 std::string 是對 C 語言中 char* 和 const char* 的一種現代化封裝和增強。它不僅解決了 C 字符串的許多缺陷&#xff08;如安全性、內存管理、易用性等&#xff09;&#xff0c;還提供了豐富的 API 來簡化字符串操作。本文將從多個維度詳細對比 std::string 與…

20250619周四:Atlassian

今天主要把conference上的A xxx的所有資料大體看了一遍&#xff0c;花了兩個多小時。 公司的這個conference系統&#xff0c;共實就是一個大型的可多人在線編輯的文件系統。差不多所有的資料都共享在上面。這對于多人參與的項目管理&#xff0c;還是相當方便的。 Atlassian最特…

通過CDH安裝Spark的詳細指南

通過CDH安裝Spark的詳細指南 簡介 Cloudera Distribution of Hadoop (CDH) 是一個企業級的大數據平臺,它集成了多個開源組件,包括Hadoop、Spark、Hive等。本文將詳細介紹如何通過CDH安裝和配置Spark。 前提條件 在開始安裝之前,請確保滿足以下條件: 已安裝CDH集群具有管…

GitLab CVE-2025-5121 安全漏洞解決方案

本分分享極狐GitLab 補丁版本 18.0.2, 17.11.4, 17.10.8 的詳細內容。這幾個版本包含重要的缺陷和安全修復代碼&#xff0c;我們強烈建議所有私有化部署用戶應該立即升級到上述的某一個版本。對于極狐GitLab SaaS&#xff0c;技術團隊已經進行了升級&#xff0c;無需用戶采取任…

【八股消消樂】Elasticsearch優化—檢索Labubu

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一個正在變禿、變強的文藝傾年。 &#x1f514;本專欄《八股消消樂》旨在記錄個人所背的八股文&#xff0c;包括Java/Go開發、Vue開發、系統架構、大模型開發、具身智能、機器學習、深度學習、力扣算法等相關知識點&#xff…

如何實現基于場景的接口自動化測試用例?

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 自動化本身是為了提高工作效率&#xff0c;不論選擇何種框架&#xff0c;何種開發語言&#xff0c;我們最終想實現的效果&#xff0c;就是讓大家用最少的代碼&…

FreeRTOS 任務管理學習筆記

FreeRTOS 任務管理學習筆記 引言 本文檔旨在通過在STM32微控制器上使用FreeRTOS來理解和實現任務管理。實驗的重點是創建和管理多個任務、處理任務同步以及通過簡單的硬件接口控制任務狀態。 實驗概述 實驗涉及創建三個任務&#xff1a; LED1_Task: 每300毫秒切換一次LED。…

c++set和pair的使用

set是C中的一種關聯容器&#xff0c;具有以下特點&#xff1a; 存儲唯一元素&#xff08;不允許重復&#xff09; 元素自動排序&#xff08;默認升序&#xff09; 基于紅黑樹實現&#xff08;平衡二叉搜索樹&#xff09; 插入、刪除和查找的時間復雜度為O(log n) 前言 在C…

終端命令行執行具體的方法名測試用例

你可以使用如下命令單獨執行 test_mutation_login_by_email 方法:python3 manage.py test apps.login.test_client.LoginTestCase.test_mutation_login_by_email 注意事項: 路徑 apps.login.test_client 要與你項目實際的 Python 包路徑一致(即 test_client.py 文件所在的包…

20250620在Ubuntu20.04.6下編譯KickPi的K7的Android14系統

【處理SDK】 rootrootrootroot-X99-Turbo:~/Android14$ tar zxvf rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android14$ ll rootrootrootroot-X99-Turbo:~/Android14$ rm rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android1…

碳中和時代的家電革命,從華為智選IAM看科技企業的環保擔當

在"雙碳"戰略與品質消費浪潮的雙重加持下&#xff0c;家電產業正經歷一場前所未有的綠色革命。華為智選與空凈十大品牌IAM的深度協同&#xff0c;不僅構建了智能家電領域的技術新高地&#xff0c;更通過系統性創新持續拓展著行業可持續發展的想象空間。從凈水科技的突…

(C語言)Map數組的實現(數據結構)(鏈表)(指針)

源代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>// 鍵值對節點 typedef struct Node {char* key;int value;struct Node* next; } Node;// Map結構 typedef struct {Node* buckets[100]; // 固定大小的哈希桶&#xff08;…

Logback示例解析

<configuration><!-- 環境變量 --><springProperty scope"context" name"app.name" source"spring.application.name" defaultValue"application"/><!-- 日志存放路徑 --><property name"log.path&qu…

elementui響應式數據類型變更情況

背景。vue2。data中定義的響應數據類型是[]數組。應用在el-select中&#xff08;非multiple情況&#xff09;。當發生響應數據有變更渲染視圖時&#xff0c;發現定義的數組轉換成了字符串。 本身不是問題。但因為疏忽引發了watch監聽formData數據時產生了產生了多次監聽事件。…

人機融合智能 | 人智交互語境下的設計新模態

本章旨在探討技術與設計領域在人智交互語境下的關系及其影響,討論通過傳統設計對人智交互的優化方法。通過回顧大數據和發展趨勢,以 AI技術作為重要的技術推力,我們認為 AI技術將會在未來成為設計領域不可缺少的重要環節,并能夠幫助設計師更加高效、準確地開展設計工作。本章著…

C++設計模式分類(GOF-23種設計模式)

文章目錄 GOF-23 設計模式分類一、從目的分類1. 創建型&#xff08;Creational&#xff09;模式2. 結構型&#xff08;Structural&#xff09;模式3. 行為型&#xff08;Behavioral&#xff09;模式 二、從范圍分類1. 類模式&#xff08;Class Pattern&#xff09;2. 對象模式&…