当前位置:首页 > 科技  > 软件

利用 GetUserMedia 和 MediaRecorder API 玩转音频录制、播放和下载

来源: 责编: 时间:2023-08-20 23:16:55 720观看
导读在这个数字化的时代,网页端的音频处理能力已经成为一个非常热门的需求。本文将详细介绍如何利用 getUserMedia 和 MediaRecorder 这两个强大的 API,实现网页端音频的录制、处理和播放等功能。让我们开始这个音频处理的

S5u28资讯网——每日最新资讯28at.com

在这个数字化的时代,网页端的音频处理能力已经成为一个非常热门的需求。本文将详细介绍如何利用 getUserMedia 和 MediaRecorder 这两个强大的 API,实现网页端音频的录制、处理和播放等功能。S5u28资讯网——每日最新资讯28at.com

让我们开始这个音频处理的旅程吧!S5u28资讯网——每日最新资讯28at.com

1、getUserMedia 和 MediaRecorder API 简介

getUserMedia 和 MediaRecorder 是 HTML5 中两个非常重要的 API,用于访问设备媒体输入流并对其进行操作。S5u28资讯网——每日最新资讯28at.com

getUserMedia

getUserMedia 允许网页端访问用户设备的媒体输入设备,比如摄像头和麦克风。通过该 API,在获得用户授权后,我们可以获取这些媒体流的数据,并用于各种网页应用场景中。S5u28资讯网——每日最新资讯28at.com

典型的使用方式如下:S5u28资讯网——每日最新资讯28at.com

// 请求获取音频流navigator.mediaDevices.getUserMedia({  audio: true}).then(stream => {  // 在此处理音频流})

getUserMedia 接受一个 constraints 对象作为参数,通过设置配置来请求获取指定的媒体类型,常见的配置有:S5u28资讯网——每日最新资讯28at.com

  • audio: Boolean 值,是否获取音频输入。
  • video: Boolean 值,是否获取视频输入。
  • 以及更详细的各种音视频参数设置。

MediaRecorder

MediaRecorder API 可以获取由 getUserMedia 生成的媒体流,并对其进行编码和封装,输出可供播放和传输的媒体文件。S5u28资讯网——每日最新资讯28at.com

典型的用法如下:S5u28资讯网——每日最新资讯28at.com

// 获取媒体流const stream = await navigator.mediaDevices.getUserMedia({ audio: true })// 创建 MediaRecorder 实例 const mediaRecorder = new MediaRecorder(stream);// 注册数据可用事件,以获取编码后的媒体数据块mediaRecorder.ondataavailable = event => {  audioChunks.push(event.data);}// 开始录制mediaRecorder.start();// 录制完成后停止mediaRecorder.stop(); // 将录制的数据组装成 Blobconst blob = new Blob(audioChunks, {  type: 'audio/mp3' });

简单来说,getUserMedia 获取输入流,MediaRecorder 对流进行编码和处理,两者结合就可以实现强大的音视频处理能力。S5u28资讯网——每日最新资讯28at.com

2、获取和处理音频流

了解了基本 API 使用方法后,我们来看看如何获取和处理音频流。S5u28资讯网——每日最新资讯28at.com

获取音频流

首先需要调用 getUserMedia 来获取音频流,典型的配置是:S5u28资讯网——每日最新资讯28at.com

const stream = await navigator.mediaDevices.getUserMedia({  audio: {    channelCount: 2,      sampleRate: 44100,    sampleSize: 16,    echoCancellation: true   }});

我们可以指定声道数、采样率、采样大小等参数来获取音频流。S5u28资讯网——每日最新资讯28at.com

选择录音设备

使用 navigator.mediaDevices.enumerateDevices() 可以获得所有可用的媒体设备列表,这样我们就可以提供设备选择功能给用户,而不仅仅是默认设备。S5u28资讯网——每日最新资讯28at.com

举例来说,如果我们想要让用户选择要使用的录音设备:S5u28资讯网——每日最新资讯28at.com

// 1. 获取录音设备列表const audioDevices = await navigator.mediaDevices.enumerateDevices();const mics = audioDevices.filter(d => d.kind === 'audioinput');// 2. 提供设备选择 UI 供用户选择const selectedMic = mics[0]; // 3. 根据选择配置进行获取流const constraints = {  audio: {    deviceId: selectedMic.deviceId  }  };const stream = await navigator.mediaDevices.getUserMedia(constraints);

这样我们就可以获得用户选择的设备录音了。S5u28资讯网——每日最新资讯28at.com

处理音频流

获得原始音频流后,我们可以利用 Web Audio API 对其进行处理。S5u28资讯网——每日最新资讯28at.com

例如添加回声效果:S5u28资讯网——每日最新资讯28at.com

// 创建音频环境const audioContext = new AudioContext();// 创建流源节点const source = audioContext.createMediaStreamSource(stream);// 创建回声效果节点const echo = audioContext.createConvolver();// 连接处理链source.connect(echo);echo.connect(audioContext.destination);// 加载回声冲击响应并应用const impulseResponse = await fetch('impulse.wav');const buffer = await impulseResponse.arrayBuffer();const audioBuffer = await audioContext.decodeAudioData(buffer);echo.buffer = audioBuffer;

通过这样的音频处理链,我们就可以在录音时添加回声、混响等音效了。S5u28资讯网——每日最新资讯28at.com

3、实现音频的录制和播放

接下来看看如何利用这些 API 实现音频的录制和播放。S5u28资讯网——每日最新资讯28at.com

录制音频

点击开始录音后,我们进行以下步骤:S5u28资讯网——每日最新资讯28at.com

  • 调用 getUserMedia 获取音频流。
  • 创建 MediaRecorder 实例,传入音频流。
  • 注册数据可用回调,以获取编码后的音频数据块。
  • 调用 recorder.start() 开始录制。
  • 录制完成后调用 recorder.stop()。
let recorder;let audioChunks = [];// 开始录音 handlerconst startRecording = async () => {  const stream = await navigator.mediaDevices.getUserMedia({    audio: true  });  recorder = new MediaRecorder(stream);  recorder.ondataavailable = event => {    audioChunks.push(event.data);  };  recorder.start();} // 停止录音 handlerconst stopRecording = () => {  if(recorder.state === "recording") {    recorder.stop();  }}

播放音频

录音完成后,我们可以将音频数据组装成一个 Blob 对象,然后赋值给一个 <audio> 元素的 src 属性进行播放:S5u28资讯网——每日最新资讯28at.com

// 录音停止后const blob = new Blob(audioChunks, { type: 'audio/ogg' }); const audioURL = URL.createObjectURL(blob);const player = document.querySelector('audio');player.src = audioURL;// 调用播放player.play();

这样就可以播放刚刚录制的音频了。S5u28资讯网——每日最新资讯28at.com

后续也可以添加下载功能等。S5u28资讯网——每日最新资讯28at.com

4、音频效果的处理

利用 Web Audio API,我们可以添加各种音频效果,进行音频处理。S5u28资讯网——每日最新资讯28at.com

例如添加回声效果:S5u28资讯网——每日最新资讯28at.com

const audioContext = new AudioContext();// 原始音频节点const source = audioContext.createMediaStreamSource(stream);// 回声效果节点const echo = audioContext.createConvolver();// 连接处理链source.connect(echo);echo.connect(audioContext.destination);// 加载冲击响应作为回声效果const impulseResponse = await fetch('impulse.wav');const arrayBuffer = await impulseResponse.arrayBuffer();const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);echo.buffer = audioBuffer;

这样在录制时音频流就会经过回声效果处理了。S5u28资讯网——每日最新资讯28at.com

此外,我们还可以添加混响、滤波、均衡器、压缩等多种音频效果,使得网页端也能处理出专业级的音频作品。S5u28资讯网——每日最新资讯28at.com

5、实时语音通话的应用

利用 getUserMedia 和 WebRTC 技术,我们还可以在网页端实现实时的点对点语音通话。S5u28资讯网——每日最新资讯28at.com

简述流程如下:S5u28资讯网——每日最新资讯28at.com

  • 通过 getUserMedia 获取本地音视频流。
  • 创建 RTCPeerConnection 实例。
  • 将本地流添加到连接上。
  • 交换 ICE 候选信息,建立连接。
  • 当检测到连接后,渲染远端用户的音视频流。

这样就可以实现类似 Skype 的网页端语音通话功能了。S5u28资讯网——每日最新资讯28at.com

// 1. 获取本地流const localStream = await navigator.mediaDevices.getUserMedia({  audio: true,  video: true});// 2. 创建连接对象const pc = new RTCPeerConnection();// 3. 添加本地流localStream.getTracks().forEach(track => pc.addTrack(track, localStream)); // 4. 交换 ICE 等信令,处理 ONADDSTREAM 等事件// ...// 5. 收到远端流,渲染到页面pc.ontrack = event => {  remoteVideo.srcObject = event.streams[0];}

获取本地输入流后,经过编码和传输就可以实现语音聊天了。S5u28资讯网——每日最新资讯28at.com

6、兼容性和 Latency 问题

尽管 getUserMedia 和 MediaRecorder 在现代浏览器中已经得到了较好的支持,但由于不同厂商和版本实现存在差异,在实际应用中还是需要注意一些兼容性问题:S5u28资讯网——每日最新资讯28at.com

  • 检测 API 支持情况,提供降级方案。
  • 注意不同浏览器对 Codec、采样率等参数支持的差异。
  • 封装浏览器差异,提供统一的 API。

此外,录音和播放也存在一定的延迟问题。我们需要针对 Latency 进行优化,比如使用更小的 buffer 大小,压缩数据包大小等方法。S5u28资讯网——每日最新资讯28at.com

7、结语:开启音频创作的新纪元

getUserMedia 和 MediaRecorder 为网页端带来了强大的媒体处理能力。通过它们,现在我们可以方便地在网页中实现录音、音频效果处理以及实时语音通话等功能了。S5u28资讯网——每日最新资讯28at.com

当然,在使用时也需要注意浏览器兼容性,以及保障用户隐私等问题。了解这些 API 的工作原理,可以让我们开发出更加优秀的音频类 Web 应用。S5u28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-6169-0.html利用 GetUserMedia 和 MediaRecorder API 玩转音频录制、播放和下载

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: UI自动化低代码平台webeye在数科业务的应用

下一篇: Electron 26.0.0 正式发布,跨平台桌面应用开发工具!

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
Top