糖粥小卖铺 2023-10-08 10:19 采纳率: 20%
浏览 3

语音流处理webrtc

img


我这音频过滤加增益的代码哪点写错了,为啥流入的pcm和流出的信号一模一样,求指点

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-08 12:21
    关注

    【相关推荐】



    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7684965
    • 这篇博客你也可以参考下:WebRTC 在一个连接获取多个摄像头
    • 您还可以看一下 周成古老师的webrtc还想学课程中的 课程介绍小节, 巩固相关知识点
    • 除此之外, 这篇博客: WebRTC实践点对点通信中的 实践代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      前端页面

      <!DOCTYPE html>
      <html>
      
      	<head>
      		<meta charset="UTF-8">
      		<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
      		<title>WebRTC实践点对点通信</title>
      		<script src="../javascript/trace.js"></script>
      		<script src="../javascript/socket.io.js"></script>
      		<script src="../javascript/jquery-1.11.1.min.js"></script>
      		<script src="../javascript/jquerysocketio.js"></script>
      		<script src="../javascript/rtc.js"></script>
      		<style type="text/css">
      			video {
      				border: 1px solid black;
      				background-color: black;
      				max-width: 100%;
      				width: 100px;
      			}
      		</style>
      		<script>
      			var cfg = {
      				ip: '127.0.0.1',
      				port: 6100
      			}
      			$(function() {
      				$.net.connect(function(person) {
      					trace("在线人数:" + person);
      					if(person.length > 0) {
      						$("#personDiv").empty();
      						person.forEach(p => {
      							if(p.id != $.net.id) {
      								var html = '<input type="radio" value="' + p.id + '" name="g" id="' + p.id + '" /><label for="' + p.id + '">' + p.id + '</label>';
      								$("#personDiv").append(html);
      							}
      						});
      					}
      				});
      				$.net.receive(function(body) {
      					trace("收到:" + JSON.stringify(body));
      				});
      				rtc.init();
      				$("#StartBtn").click(function() {
      					rtc.call();
      				});
      				$("#personDiv").delegate("input[type='radio']", "click", function() {
      					rtc.curVideoFriendId=this.value;
      				});
      			})
      		</script>
      	</head>
      
      	<body>
      		<h1>WebRTC实践点对点通信</h1>
      		<video id="localVideo" autoplay playsinline></video>
      		<video id="remoteVideo" autoplay playsinline></video>
      		<input type="button" value="Start" id="StartBtn" />
      		<input type="button" value="Close" id="CloseBtn" />
      		<div id="personDiv"></div>
      	</body>
      
      </html>
      

      RTC代码

      var rtc = (function() {
          ///通讯是否创建
          var isChannelReady = false;
          ///房间是否创建
          var isInitiator = false;
          var isStarted = false;
          var remoteStream;
          ///当前收到对方的房间号
          var curReceiveRoomId = "";
          var pc = new RTCPeerConnection(null);
          pc.onicecandidate = function(event) {
              trace('icecandidate event: ', event);
              if (event.candidate) {
                  sendMessage({
                      type: 'candidate',
                      label: event.candidate.sdpMLineIndex,
                      id: event.candidate.sdpMid,
                      candidate: event.candidate.candidate
                  });
              } else {
                  trace('End of candidates.');
              }
          };
          pc.onaddstream = function(event) {
              trace('Remote stream added.');
              remoteStream = event.stream;
              document.getElementById("remoteVideo").srcObject = remoteStream;
          };
      
          $.net.join(function() {
                  ///通道已准备就绪
                  isChannelReady = true;
              })
              .call(doOffer)
              .offer(doAnswer)
              .answer(function(message) {
                  if (isStarted) {
                      pc.setRemoteDescription(new RTCSessionDescription(message));
                  }
              })
              .candidate(function(message) {
                  if (isStarted) {
                      pc.addIceCandidate(new RTCIceCandidate({
                          sdpMLineIndex: message.label,
                          candidate: message.candidate
                      }));
                  }
              })
              .bye(function(message) {
                  if (isStarted) {
                      trace('对方连接已断开。');
                      pc.close();
                      pc = null;
                      isStarted = false;
                      isInitiator = false;
                  }
              });
      
          function sendMessage(message) {
              $.net.meeting(message);
          }
      
          function doCall() {
              //var toid = $("input[name='g']:checked").val();
              var toid = rtc.curVideoFriendId;
              if (!toid) {
                  alert('暂无目标好友。');
                  return;
              }
              var cmd = {
                  body: 'got user media',
                  roomid: curReceiveRoomId ? curReceiveRoomId : $.net.id
              };
              $.net.send(cmd, toid, 'media');
              trace('发送' + JSON.stringify(cmd));
          }
      
          function doOffer(msg) {
              if (msg.roomid) {
                  curReceiveRoomId = msg.roomid;
                  trace('收到对方的房间编号 "' + curReceiveRoomId + '" !');
              }
              if (!isChannelReady) {
                  trace('网络通讯没有建立不能发offer');
                  return;
              }
              if (!isInitiator) {
                  trace('不是房间创建者不能发offer');
                  return;
              }
              trace('发送视频通话邀请函offer');
              pc.createOffer(function(description) {
                  pc.setLocalDescription(description); //触发onicecandidate事件
                  trace('setLocalAndSendMessage sending message', description);
                  sendMessage(description);
              }, trace);
              isStarted = true;
          }
      
          function doAnswer(message) {
              trace('Sending answer to peer.');
              pc.setRemoteDescription(new RTCSessionDescription(message)); //触发onaddstream事件
              pc.createAnswer().then(
                  function(description) {
                      pc.setLocalDescription(description); //触发onicecandidate事件
                      trace('setLocalAndSendMessage sending message', description);
                      sendMessage(description);
                  }, trace
              );
          }
          return {
              curVideoFriendId: '',
              close: function() {
                  sendMessage('bye');
                  /*
                  var room = roomService.get();
                  if(room.id == $.net.id) {
                  	trace('房间 "' + room.id + '"已销毁。');
                  	roomService.delete();
                  }*/
                  curReceiveRoomId = "";
              },
              room: function() {
                  //var room = roomService.get();
                  if (curReceiveRoomId) {
                      $.net.meeting('join', curReceiveRoomId, function(r) {
                          trace('入进房间:', JSON.stringify(r));
                          isChannelReady = true;
                      });
                  } else {
                      //room = roomService.create($.net.id);
                      //room = roomService.create('testRoom');
                      $.net.meeting('create', $.net.id, function(r) {
                          trace('创建房间', JSON.stringify(r));
                          isInitiator = true;
                      });
                  }
              },
              video: function(ctrl) {
                  navigator.mediaDevices.getUserMedia({
                      audio: false,
                      video: true
                  }).then(stream => {
                      trace('本地视频已开启。');
                      if (stream) {
                          pc.addStream(stream)
                          document.getElementById(ctrl).srcObject = stream;
                          ///本是视频就绪,向对方主播发送call通知
                          doCall();
                      }
                  });
              },
              call: function() {
                  if (!rtc.curVideoFriendId) {
                      alert('没有选择视频通话的目标好友!');
                      return;
                  }
                  rtc.room();
                  rtc.video("localVideo");
              },
              init: function() {
                  window.onbeforeunload = rtc.close;
                  $(document).delegate("#CloseBtn", "click", function() {
                      rtc.close();
                  });
              }
          }
      })();
      

      服务端(Nodejs)

      var persons = [];
      var getPersonSeq = function() {
          var tempSeq = Math.floor(Math.random() * 5) + 1;
          persons.forEach(p => {
              if (p.seq == tempSeq) {
                  tempSeq = getPersonSeq();
              }
          });
          return tempSeq;
      }
      io.sockets.on('connection', function(socket) {
          if (persons.indexOf(socket.id) == -1) {
              persons.push({
                  id: socket.id,
                  seq: getPersonSeq()
              });
          }
      
          function trace() {
              console.log(arguments);
          }
          console.log("用户 '" + socket.id + "' 连接成功!");
          socket.emit('ready', socket.id, persons);
          socket.broadcast.emit('change', persons);
          socket.on('disconnect', function() {
              trace('终端(' + socket.id + ')已断开。 ');
              var tempPersons = [];
              persons.forEach(e => {
                  if (e.id != socket.id) {
                      tempPersons.push(e);
                  }
              });
              persons = tempPersons;
              //rooms.del(socket.id);
              socket.broadcast.emit('change', persons);
          });
          socket.on('message', function(body) {
              var d = new Date();
              body.from = socket.id;
              body.time = d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();
              socket.to(body.to).emit('message', body);
              trace('终端(' + socket.id + "):message>", body);
          });
          socket.on('meeting', function(body) {
              ///向除自己外所有meeting终端广播消息
              socket.broadcast.emit('meeting', body);
              //sockets.in(room).emit('meeting', body);
              trace('终端(' + socket.id + "):meeting>", body);
          });
          socket.on('create', function(room, callbackfunc) {
              var clientsInRoom = io.sockets.adapter.rooms[room];
              var numClients = clientsInRoom ? Object.keys(clientsInRoom.sockets).length : 0;
              var temproom = {
                  id: room,
                  count: numClients
              };
              socket.join(room);
              //rooms.save(temproom);
              if (typeof(callbackfunc) == 'function') {
                  callbackfunc(temproom);
              }
          });
          socket.on('join', function(room, callbackfunc) {
              var clientsInRoom = io.sockets.adapter.rooms[room];
              var numClients = clientsInRoom ? Object.keys(clientsInRoom.sockets).length : 0;
              var robj = {
                  id: room,
                  count: numClients
              }
              switch (numClients) {
                  case 0:
                      trace('终端(' + socket.id + ')进入的房间 ”' + room + '" 不存在!');
                      socket.emit('empty', room);
                      break;
                  case 1:
                      ///向房间room中发送消息
                      io.sockets.in(room).emit('join', room);
                      socket.join(room);
                      trace('房间 ' + room + '中现在有' + numClients + '个终端!');
                      break;
                  case 2:
                      socket.emit('full', room);
                      trace('房间 ”' + room + '" 已满。');
                      break;
              }
              if (typeof(callbackfunc) == 'function') {
                  callbackfunc(robj);
              }
          });
          socket.on('ipaddr', function() {
              var ifaces = os.networkInterfaces();
              for (var dev in ifaces) {
                  ifaces[dev].forEach(function(details) {
                      if (details.family === 'IPv4' && details.address !== '127.0.0.1') {
                          socket.emit('ipaddr', details.address);
                      }
                  });
              }
          });
      
      });
      

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月8日

悬赏问题

  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗