首页 > 其他分享 >WebRtc实时音波

WebRtc实时音波

时间:2024-03-19 17:31:48浏览次数:30  
标签:canvas const methods audioSteam 实时 current 音波 canvasCtx WebRtc

摘要:
最近在做音视频相关业务,用的到了webRtc技术,掌握这些方法可以结合业务做,麦克风检测、录制音频,都是可以的;基本操作和其它方法都写好在methods中了;

全局变量
// 后续会创建AnalyserNode对象
let analyser: any = null;
// 后续赋值canvas标签对象
let canvas: any = null;
// canvas 2d对象
let canvasCtx: any = null;
let audioSteam: any = { // 获取音视频MediaStream对象
    current: null
}
HTML
<div>
    // 绘制音波
    <canvas id="devDetectionMicroCanvas" className={style.audio_canvas}></canvas>
    // 实时播放
    <audio id="devDetectionMicroRef" autoPlay></audio>
</div>
获取音视频流
// 使用getUserMedia API获取音频流。
navigator.mediaDevices.getUserMedia({
    audio: true
}).then(stream => {
    /* MediaStream赋值到全局对象,后续使用 */
    audioSteam.current = stream;
    /* 获取当前采集设备名称 */
    methods.handleStreamGetMicroName();
    /* 把媒体流赋值给audio标签进行试试播放 */
    methods.handleAudioPlay();
    /* 开始准备制作试试音波 */
    methods.handleCanvasAudioContext();
})
.catch(error => {
    let errorMessage = error + '';
    if (errorMessage.includes('Permission denied')) {
        errorMessage = '请开启麦克风权限';
    } else if (errorMessage.includes('Requested device not found')) {
        errorMessage = '请检测麦克风是否插入';
    };
    console.log('error', errorMessage)
});
其它方法
const methods = {
    // 处理canvas和audioContext
    handleCanvasAudioContext() {
         // 1. 使用AudioContext API创建一个AudioContext对象,并将音频流添加到它上面
        const audioContext = new AudioContext();
        const source = audioContext.createMediaStreamSource(stream);
        // 2. 创建AnalyserNode对象,并将其连接到source节点。
        analyser = audioContext.createAnalyser();
        source.connect(analyser);
        // 3. 获取实时音频数据并将其转换为可视化数据。例如,可以使用getByteTimeDomainData()方法获取时域数据,并将其转换为音波。
        canvas = document.getElementById("devDetectionMicroCanvas");
        canvasCtx = canvas.getContext("2d");
        // 4.启动波纹动画
        methods.drawWaveform();
    },
    // 波纹动画
    drawWaveform() {
        const stream = audioSteam.current;
        // 获取时域数据
        const dataArray = new Uint8Array(analyser.fftSize);
        analyser.getByteTimeDomainData(dataArray);

        // 绘制音波
        canvasCtx.clearRect(0, 0, canvas.width, canvas.height);
        canvasCtx.lineWidth = 2;
        canvasCtx.strokeStyle = "rgb(69, 255, 56)";
        canvasCtx.beginPath();
        const sliceWidth = canvas.width * 1.0 / analyser.fftSize;
        let x = 0;
        for(let i = 0; i < analyser.fftSize; i++) {
            const v = dataArray[i] / 128.0;
            const y = v * canvas.height / 2;
            if(i === 0) {
                canvasCtx.moveTo(x, y);
            } else {
                canvasCtx.lineTo(x, y);
            }
            x += sliceWidth;
        }
        canvasCtx.stroke();
        requestAnimationFrame(methods.drawWaveform);
    },
    // 获取采集设备名称
    handleStreamGetMicroName(){
        if (audioSteam.current) {
            const audioTrack = audioSteam.current.getAudioTracks()[0];
            // audioTrack.label;
            console.log('当前采集设备名称', audioTrack.label);
        }
    },
    // 处理audio播放
    handleAudioPlay() {
        const stream = audioSteam.current;
        const elm: HTMLVideoElement | any = document.getElementById('devDetectionMicroRef');
        if (elm) {
            elm.srcObject = stream;
        }
    },
    // 停止麦克采集
    stopAudioSteam() {
        if (audioSteam.current) {
            audioSteam.current.getTracks().forEach((sender: any) => {
                sender.stop();
            });
        }
    },
}

标签:canvas,const,methods,audioSteam,实时,current,音波,canvasCtx,WebRtc
From: https://blog.csdn.net/u014708123/article/details/136849424

相关文章

  • vue使用JSWebrtc播放webrtc视频流
    1、下载JSWebrtc.min.js文件地址:https://github.com/kernelj/jswebrtc/tree/master/dist 或者再此路径下载 https://files.cnblogs.com/files/blogs/702532/jswebrtc.min.js?t=1710839018&download=true2、使用jswebrtc2.1文件放到public/static目录下,位置不能放错 2......
  • Docker实时同步备份数据至阿里云盘
    随着互联网的快速发展网站数据的安全性变得越来越重要,一旦网站数据丢失或被损坏将对企业个人的运营产生重大影响。因此做好网站数据的备份工作至关重要,阿里云盘作为阿里巴巴旗下的云存储服务,具有安全高效便捷等特点是备份网站数据的理想选择,但是各大LinuxWindows服务器系统......
  • Qt/C++监控推流设备推流/延迟极低/实时性极高/rtsp/rtmp推流/hls/flv/webrtc拉流/调整
    一、前言算下来这个推流的项目作品写了有四年多了,最初第一个版本只有文件点播的功能,用的纯QTcpSocket通信实现,属于比较简单的功能。由于文件点播只支持文件形式的推流,不支持网络流或者本地设备采集,所以迫切需要打破这个瓶颈,而后加入核心的网络推流功能,这也是本项目的核心功能,不仅......
  • 【Linux】linuxCNC+Qt+Opencascade+kdl+hal 实时6轴机器人控制器
    CNC机器人程序框架机器人模型笔记:debian重启后无法打开共享目录最新版搜狗输入法安装后不支持中文,需要安装旧版本的sogoupinyin_4.0.1.2800_x86_64.deb可用数控机器人在哪些领域应用有优势数控机器人在多个领域都展现出了显著的优势,特别是在需要高精度和......
  • 革新车身零件尺寸管理,实时数据分析,系统解决方案
    在当今汽车制造业中,精确的尺寸管理和质量控制是至关重要的。然而,许多主机厂目前仍在使用传统的Excel表格进行数据分析和管理,这种方法存在手动录入数据和发现问题不及时的弊端。我们带来了一种全新的解决方案,专为车身零件尺寸管理和数据分析而设计。我们的系统是基于云端的SaaS......
  • 【原创】三十分钟实时数据可视化网站前后端教程 Scrapy + Django + React 保姆级教程
    这个本来是想做视频的,所以是以讲稿的形式写的。最后没做视频,但是觉得这篇文还是值得记录一下。真的要多记录,不然一些不常用的东西即使做过几个月又有点陌生了。文章目录爬虫SCRAPYxpath后端DJANGO前端REACTHello大家好这里是小鱼,最近我做了一个前后端分离的实......
  • 实时数据传输的新里程——Server-Sent Events(SSE)消息推送技术
    目录一、背景介绍二、SSE场景案例三、工作原理    3.1SSE工作流程    3.2工作原理一、背景介绍    传统的请求模型是客户端发送一个请求到服务端,然后服务端做相应的处理,然后再将结果返回给客户端,这种“一问一答”的方式随着时间的推移并不......
  • 后端返回的数据会不会不符合页面上的展示,还是说后端返回的数据结构就是页面上需要展示
    后端返回的数据可能不一定完全符合前端页面展示的需求,这取决于后端API设计和前端UI/UX的设计。有时后端返回的数据可能是原始数据或者为了满足数据库存储需求的结构化数据,而前端可能需要对这些数据进行处理以便更好地呈现给用户。数据适配:如果后端返回的数据结构与前端展示所......
  • webrtc
    一、什么是WebRTCWebRTC(WebReal-TimeCommunication)是一个由Google、Mozilla、Opera等公司发起的开源项目,它支持网页浏览器进行实时音视频对话。它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和音频流或者其他任意数据的传......
  • 全量知识系统 因子分析+在线处理+实时库+生存拓扑控制+跨语言 的设想及百度AI答问 之3
    Q12.进一步,在因子分析+在线处理+生存拓扑控制的基础上,三种实时表的在线处理程序由三个不同程序语言的代理类来代理,以分离不同目标机的编程语言环境的影响。(因为,这里要限制目标编程语言中的数据类型以简化实现过程,并方便适应不同的应用需求).这三个代理类分别是:PythonBroker......