web音频流转发之音频源

前言

web音频流转发之音视频直播
web音频流转发之AudioNode
app能直播,web为什么不可以?看完本系列文章,你就能做一个直播,真正的直播,包括音频流的转发,这也是我最近查看web audio api发现有相关api能实现音频流的转发,所有打算分享系列文章供大家交流,如有不对之处请指正。看完本系列文章能完成一个web直播,当然包括视频流。当然webrtc也能实现web直播,但是实现原理有所差别。文章也很简单就是对web audio api的灵活使用。

兼容性

兼容性是有必要看下,顺便看一下ie,和安卓Android Browse的兼容性,然而我想说我的荣耀8 安卓6.0 还是嵌套的chrome 37你们信吗?到底是作为一个渐渐增强的功能,还是作为一个装逼技能就看大家的使用啦!
图片描述

概述

一个简单而典型的web audio流程如下:
1.创建音频上下文
2.在音频上下文里创建源 — 例如 <audio>, 振荡器, 流
3.创建效果节点,例如混响、双二阶滤波器、平移、压缩
4.为音频选择一个目地,例如你的系统扬声器
5.连接源到效果器,对目的地进行效果输出
图片描述
这段话引用自MDN,这一章我主要讲解inputs中的3个api。

createMediaElementSource

下面是一个简单到极点的例子,完成了从audio获取音频源,然后输出到你的扬声器设备。
这个方法我们在直播中做用不到。

//创建音频上下文
let audioCtx = new (window.AudioContext || window.webkitAudioContext)(),
    //获取audio节点
    myAudio = document.querySelector('audio'),
    //创建音频源
    source = audioCtx.createMediaElementSource(myAudio),
    //将音频源直接连接到输出设备
    source.connect(audioCtx.destination);

createMediaStreamSource

这个方法介绍的是用navigator.mediaDevices.getUserMedia(navigator.getUserMedia已经废弃)获取到的音频流作为音频流。在直播时我们会采用此方法作为,音频流的采集方法;当然在这里我们也会获取到我们需要的视频流数据

 //简单兼容
 let getUserMedia = navigator.mediaDevices.getUserMedia || navigator.getUserMedia;
 //获取麦克风,摄像头权限
 getUserMedia({audio: true, video: true}).then(stream => {
    let audioCtx = new AudioContext(),
        //以流媒体作为音频源
        source = audioCtx.createMediaStreamSource(stream);
        //将音频源直接连接到输出设备
        source.connect(audioCtx.destination);
    });

createBufferSource

这个方法相对前面两个稍微复杂一点点。createBufferSource是由存储器中的音频数据组成的音频源,它通过AudioBuffer来进行存储,解释一下:它是通过一个固定的音频数据的二进制作为音频源,比如一首歌的二进制数据。

  let audioCtx = new (window.AudioContext || window.webkitAudioContext)(),  
  source = audioCtx.createBufferSource();
  //myArrayBuffer是一个AudioBuffer
  source.buffer = myArrayBuffer;
  source.loop = true; //循环播放
  source.connect(audioCtx.destination);
  source.start(); //开始播放音频源

下面讲讲myArrayBuffer的几种来源方式

//1.通过input=file 获取的音频文件
let fileInput = document.querySelector('input'),
    audioCtx = new (window.AudioContext || window.webkitAudioContext)();
    fileInput.onchange = function(ev){
        let file = ev.target.files[0],
        fr = new FileReader();
        fr.readAsArrayBuffer(file);
        fr.onload = function(data){
            //result是一个arraybuffer类型二进制数据
            let result = data.target.result;
            //解析数据
            analyticBuffer(result);
        };
    };
//2.通过XHR获取音频数据(注意需要返回arraybuffer类型)
  let request = new XMLHttpRequest();
  request.open('GET', 'xxx.mp3', true);
  //指定文件返回数据类型
  request.responseType = 'arraybuffer'; 
  //请求成功时执行
  request.onload = function() {
    //这是一个arraybuffer
    var buffer = request.response;
    //解析数据
    analyticBuffer(buffer )
  }
  request.send();

  //解析二进制数据
  function analyticBuffer(buffer){
    //将ArrayBuffer异步转换为一个AudioBuffer类型
    audioCtx.decodeAudioData(buffer, (myArrayBuffer) => {
          let source  = audioCtx.createBufferSource();
            source.buffer = myArrayBuffer;
            source.connect(audioCtx.destination);
            source.start();
    });
   }
//3.自己创造一个AudioBuffer
    //采样率sample/s
let sampleRate = audioCtx.sampleRate, 
    //帧数,音频时间 = frameCount / sampleRate
    frameCount = audioCtx.sampleRate * 2.0, 
    //创建一个两通道的音频数据,这是一个没有声音的音频数据
    myArrayBuffer = audioCtx.createBuffer(2, frameCount , sampleRate);
    //随机填充白噪音
        //两个通道循环2次
    for (var channel = 0; channel < 2; channel++) {
        //获取每个通道的array数据
        var nowBuffering = myArrayBuffer.getChannelData(channel);
        for (let i = 0; i < frameCount; i++) {
          //对每一帧填充数据
          nowBuffering[i] = Math.random() * 2 - 1;
        }
  }

AudioBuffer的属性和方法

AudioBuffer的方法在我们直播的时候需要用到,在后面的AudioNode(音频处理模块)中也会出现AudioBuffer数据,我们需要它是获取和传输数据

 let myArrayBuffer = audioCtx.createBuffer(2, 4096, sampleRate);
    myArrayBuffer.sampleRate //采样数
    myArrayBuffer.length //采样帧率 也就是4096
    myArrayBuffer.duration //时长
    myArrayBuffer.numberOfChannels //通道数
    //返回x通道的Float32Array类型的数据,x表示是哪个通道0或1
    myArrayBuffer.getChannelData(x) 
    //将myArrayBuffer第x通道的数据复制到anotherArray中,y表示数据复制开始的偏移量
    let anotherArray = new Float32Array;
    myArrayBuffer.copyFromChannel(anotherArray,x,y);
    //将anotherArray数据复制到myArrayBuffer的X通道中,y偏移量
    let anotherArray = new Float32Array;
    myArrayBuffer.copyToChannel(anotherArray,x,y);
    //关于copyToChannel,copyFromChannel,getChannelData在下一章看见例子就明白了

结束语

这一章大概就说到这么多吧,都是一些简单的api使用,下一章结合以后例子讲解部分AudioNode。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WebSocket音频是一种通过WebSocket协议进行传输的音频数据WebSocket是一种基于TCP的全双工通信协议,可以在服务器和客户端之间实现实时的双向通信。 通过使用WebSocket进行音频传输,可以实现实时性高、延迟低的音频通信。相比传统的HTTP请求响应机制,WebSocket可以建立一条持久性的连接,在连接建立后,服务器和客户端就可以通过这条连接进行数据的双向传输,而无需每次通信都建立新的连接。 WebSocket音频的传输方式有两种:一种是将音频数据进行分片,然后通过WebSocket一帧帧地发送;另一种是将音频数据进行压缩编码,然后通过WebSocket传输。对于分片传输,可以在客户端接收到所有分片后再合并成完整的音频数据;对于压缩编码传输,需要在客户端对接收到的音频数据进行解码才能得到原始的音频数据。 WebSocket音频的应用场景广泛,比如实时语音聊天、在线音乐播放、语音识别等。在语音聊天应用中,通过WebSocket音频可以实时传输用户的声音,实现双方之间的实时音频通话。在在线音乐播放应用中,可以通过WebSocket音频将音乐数据实时传输到客户端进行播放。在语音识别应用中,可以通过WebSocket音频将用户的语音输入实时发送到服务器进行语音识别处理。 总之,WebSocket音频是一种高效、实时的音频数据传输方式,适用于许多需要实时音频通信或处理的应用场景。 ### 回答2: WebSocket音频是一种通过WebSocket协议传输的数据,用于实时传输音频数据。WebSocket是一种全双工通信协议,使得服务器和客户端可以进行实时的双向通信。音频是指连续的音频数据,通过WebSocket传输的音频可以用于实现语音通话、音频会议等应用场景。 在使用WebSocket传输音频时,首先需要建立WebSocket连接。客户端和服务器通过握手过程建立起连接,并使用WebSocket API进行数据传输。一旦连接建立成功,客户端和服务器可以通过WebSocket对象中的send()方法发送音频数据,并使用onmessage事件监听接收到的数据。 在客户端,可以通过浏览器提供的WebRTC技术获取用户的音频输入,并将其转换为音频进行传输。服务器端可以接收到音频后,可以对音频数据进行处理、解码等操作,然后再将处理后的音频数据发送给需要接收的客户端。客户端接收到音频数据后,可以使用Web Audio API对音频进行播放。 由于WebSocket协议支持双向通信,因此在音频传输过程中,客户端和服务器可以进行实时的数据交互。这样的实时性和双向性使得WebSocket音频在语音通话、音频会议等实时应用中具有广泛应用的潜力。 总之,WebSocket音频是一种通过WebSocket协议传输的实时音频数据,可以实现实时的语音通话、音频会议等功能。通过WebSocket协议的双向通信特性,客户端和服务器可以进行实时的音频数据交互。这样的特点使得WebSocket音频在实时通信领域具有很大的前景。 ### 回答3: websocket音频是一种通过websocket协议传输音频数据的技术。通过websocket协议传输音频数据可以实现实时的音频通信,可以被用于实现在线直播、在线语音聊天、语音识别等应用。 使用websocket传输音频的步骤如下: 1. 建立websocket连接:客户端通过浏览器的WebSocket对象建立与服务器的websocket连接。 2. 发送音频数据:客户端将音频数据(如声音的PCM编码)分片发送给服务器。服务器可以使用WebRTC、FFmpeg等工具对音频数据进行编解码处理。 3. 接收和处理音频数据:服务器接收到音频数据后,可以进行处理,例如实时转发给其他客户端或进行后续的处理(如语音识别)。 4. 客户端播放音频:服务器将处理过的音频数据发送给接收方客户端,客户端通过浏览器的Web Audio API进行音频解码和播放。 使用websocket传输音频的好处包括: 1. 实时性:websocket协议能够提供实时的双向通信,适合实现实时的音频通信。 2. 跨平台:由于websocket使用标准的HTTP和TCP协议,可以在多种设备上实现音频通信,例如在PC端、手机端、智能音箱等设备上进行语音聊天。 3. 简洁性:相比传统的音频传输方式(如RTMP),websocket协议更简洁,不需要额外的握手过程和协议封装。 需要注意的是,websocket音频在传输过程中可能存在延迟和丢包的情况,需要根据具体的应用场景进行性能优化和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值