基于WebSocket实现的前端实时声音告警提醒功能

原理介绍:

项目需求 Web端播放实时音频流,折腾了两天后问题得以解决。记录下开发调试过程,方便后来者。首次想到是利用Audio标签,Audio标签可以直接播放MP3格式,服务端将实时音频流编码成WAV格式通过Http方式传给Web端即可。采用Audio Web API方式播放实时流会出现卡顿现象,以上方法一次性解码的数据可以连续播放,每次解码后要重新创建BufferSource,显而易见这种播放模式播放实时流效率很低,查阅了Audio Web API 文档 播放网络流似乎要利用,基于AudioWorkletProcessor的自定义节点,文档也给了一个简单的例子。另外一种可行的方法是服务端输出Rtmp音频流 通过video.js播放实际应该是用了flash。项目开始已经想到了这个方案可行只是觉得有些绕(需要将音频流封装后推送到rtmp server)。另外一个可行的方案就是利用H5 MSE实现,这个方案也有开源的库可以用,例如video.js 或flv.js这需要服务端将音频打包成flv格式,推送给Web前端,Web端接收到音频数据后调用flv.js进行播放。

前端代码如下所示:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>Web Audio API 测试</title>
<script src="../static/js/reconnectingwebsocket.js"
	th:href=@{/js/reconnectingwebsocket.js}></script>
</head>
<body>
	<table>
		<tr>
			<td>参数:</td>
			<td><input style="width: 390px;" type="text" name="type"
				id="type"></td>
			<td>
				<button onclick="onSendMessage()">发送消息</button>
			</td>
			<td>
				<button onclick="onCloseMessage()">断开连接</button>
			</td>
		</tr>

	</table>
</body>

<script>
	//Web Audio API
	var nextStartTime = 0;
	var context = null;
	try {
		context = new (window.AudioContext || window.webkitAudioContext)();
	} catch (e) {
		alert('您当前的浏览器不支持Web Audio API ');
	}

	var objSocket = null;
	var wsUrl = 'ws://localhost:8080/Audiowebsocket';
	if ('WebSocket' in window) {
		//objSocket = new ReconnectingWebSocket(wsUrl);
		objSocket = new WebSocket(wsUrl);
	} else {
		alert('Not support websocket')
	}
	/** 
		WebSocket服务连接
	 */
	objSocket.onopen = function(evt) {
		onOpen(evt)
	};
	objSocket.onclose = function(evt) {
		onClose(evt)
	};
	objSocket.onmessage = function(evt) {
		onMessage(evt)
	};
	objSocket.onerror = function(evt) {
		onError(evt)
	};

	function onOpen(evt) {
		console.log("Connected to WebSocket server.");
	}

	function onClose(evt) {
		console.log("Disconnected");
	}

	function onError(evt) {
		console.log('Error occured: ' + evt.data);
	}

	function onMessage(evt) { //websocket返回数据信息处理
		//console.log('Retrieved data from server: ' + evt.data);
		var reader = new FileReader(); //文件阅读器
		reader.readAsArrayBuffer(evt.data); //读取成ArrayBuffer对象
		reader.onload = function() { //读取完毕
			//解码
			context.decodeAudioData(this.result, function(buffer) {
				console.log("decode success");
				playSound(buffer);
			}, function(e) {
				console.log("decode failed");
				"Error with decoding audio data" + e.
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue 3中实现基于WebSocket实时报警提示框功能,你需要完成以下步骤: 1. 安装WebSocket库 你可以使用`npm`或`yarn`来安装WebSocket库,例如`websocket`或`socket.io-client`。 2. 创建WebSocket连接 在Vue 3中,你可以在`setup()`函数中使用`ref`或`reactive`来创建WebSocket连接。例如: ``` import { ref } from 'vue' import { io } from 'socket.io-client' export default { setup() { const socket = io('ws://localhost:3000') const message = ref('') socket.on('connect', () => { console.log('Connected to WebSocket server') }) socket.on('message', (data) => { message.value = data }) return { message } } } ``` 这个例子中,我们使用`socket.io-client`库创建了一个WebSocket连接,并在`connect`和`message`事件上添加了监听器。`message`事件会在服务器发送消息触发,并将消息内容存储在`message`变量中。 3. 在页面中显示实时报警提示框 在Vue 3中,你可以在模板中使用`v-if`或`v-show`来显示或隐藏实时报警提示框。例如: ``` <template> <div> <div v-if="message">{{ message }}</div> </div> </template> ``` 这个例子中,我们使用`v-if`来检查是否有消息要显示。如果`message`变量包含消息内容,则显示实时报警提示框。 4. 发送WebSocket消息 如果你想在Vue 3中发送WebSocket消息,可以使用与创建连接相同的方法。例如: ``` import { io } from 'socket.io-client' export default { methods: { sendMessage(message) { const socket = io('ws://localhost:3000') socket.emit('message', message) } } } ``` 这个例子中,我们使用`socket.io-client`库创建一个WebSocket连接,并使用`emit()`方法发送一个名为`message`的事件。服务器可以在接收到消息做出相应的处理,例如发送实时报警提示框。 希望这能帮助你在Vue 3中实现基于WebSocket实时报警提示框功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值