janus webrtc 中显示本地上传的速度

本文介绍了一种利用Janus WebRTC获取本地上传速度的方法。通过使用getSenders()和getStats()方法,可以周期性地收集发送者的统计信息,并据此计算出实时的上传速率和包速率。

janus在默认的api 没提供本地上传的速度 可以通过webrtc的getstatus()来获取参考

https://webrtc.github.io/samples/src/content/peerconnection/audio/

重点参考main.js

window.setInterval(() => {
  if (!pc1) {
    return;
  }
  const sender = pc1.getSenders()[0];
  if (!sender) {
    return;
  }
  sender.getStats().then(res => {
    res.forEach(report => {
      let bytes;
      let headerBytes;
      let packets;
      if (report.type === 'outbound-rtp') {
        if (report.isRemote) {
          return;
        }
        const now = report.timestamp;
        bytes = report.bytesSent;
        headerBytes = report.headerBytesSent;

        packets = report.packetsSent;
        if (lastResult && lastResult.has(report.id)) {
          const deltaT = (now - lastResult.get(report.id).timestamp) / 1000;
          // calculate bitrate
          const bitrate = 8 * (bytes - lastResult.get(report.id).bytesSent) /
            deltaT;
          const headerrate = 8 * (headerBytes - lastResult.get(report.id).headerBytesSent) /
            deltaT;

          // append to chart
          bitrateSeries.addPoint(now, bitrate);
          headerrateSeries.addPoint(now, headerrate);
          targetBitrateSeries.addPoint(now, report.targetBitrate);
          bitrateGraph.setDataSeries([bitrateSeries, headerrateSeries, targetBitrateSeries]);
          bitrateGraph.updateEndDate();

          // calculate number of packets and append to chart
          packetSeries.addPoint(now, (packets -
            lastResult.get(report.id).packetsSent) / deltaT);
          packetGraph.setDataSeries([packetSeries]);
          packetGraph.updateEndDate();
        }
      }
    });
    lastResult = res;
  });
}, 1000);
将上面的pc 换成janus的pc就行了
每次和上次做对比 bitrate /1024 kb就是上传速度了

### 3.1 基于 JavaWebRTC 视频流录制与存储实现 在 WebRTC 视频会议系统中,录制远程或本地音视频流是常见的功能需求。由于 WebRTC 本身不提供录制功能,通常需要通过浏览器端或服务器端实现录制与存储。 #### 3.1.1 浏览器端录制与存储 浏览器端可通过 `MediaRecorder` API 实现对音视频流的录制。该 API 支持将 `MediaStream` 录制为 `Blob` 数据,并可通过 `URL.createObjectURL` 播放或上传至服务器保存。 以下是一个使用 JavaScript 实现的录制示例: ```javascript let mediaRecorder; let recordedChunks = []; function startRecording(stream) { mediaRecorder = new MediaRecorder(stream, { mimeType: 'video/webm;codecs=vp9' }); mediaRecorder.ondataavailable = function(event) { if (event.data.size > 0) { recordedChunks.push(event.data); } }; mediaRecorder.onstop = function() { const blob = new Blob(recordedChunks, { type: 'video/webm' }); recordedChunks = []; const videoURL = URL.createObjectURL(blob); const a = document.createElement('a'); a.style.display = 'none'; a.href = videoURL; a.download = 'recording.webm'; document.body.appendChild(a); a.click(); URL.revokeObjectURL(videoURL); document.body.removeChild(a); }; mediaRecorder.start(1000); // 每秒收集一次数据 } ``` 该方法适用于单个客户端录制本地或远程视频流,并将录制结果保存为文件 [^3]。 #### 3.1.2 服务器端录制与存储 若需集中管理录制文件,可在服务器端接收并存储 WebRTC 视频流。Java 可通过集成 SFU(Selective Forwarding Unit)服务器如 Kurento、Janus 或 Mediasoup 实现录制功能。 以 Kurento 为例,其提供 `RecorderEndpoint` 可用于录制音视频流: ```java KurentoClient kurento = KurentoClient.create("ws://localhost:8888/kurento"); MediaPipeline pipeline = kurento.createMediaPipeline(); WebRtcEndpoint webRtcEndpoint = new WebRtcEndpoint.Builder(pipeline).build(); RecorderEndpoint recorder = new RecorderEndpoint.Builder(pipeline, "file:///path/to/recording.webm").build(); webRtcEndpoint.connect(recorder); // 连接至录制端点 String sdpOffer = getOfferFromClient(); String sdpAnswer = webRtcEndpoint.processOffer(sdpOffer); sendAnswerToClient(sdpAnswer); recorder.record(); // 开始录制 ``` 录制完成后,可调用 `recorder.stop();` 停止录制并保存文件 [^1]。 #### 3.1.3 视频流存储与管理 录制的视频文件通常以 WebM、MP4 等格式存储。Java 后端可通过文件系统或对象存储(如 AWS S3、MinIO)进行集中管理。例如,使用 Spring Boot 实现文件上传与存储: ```java @RestController public class RecordingController { @PostMapping("/upload") public ResponseEntity<String> uploadRecording(@RequestParam("file") MultipartFile file) { try { String uploadDir = "recordings/"; Path uploadPath = Paths.get(uploadDir); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } String originalFilename = file.getOriginalFilename(); Path filePath = uploadPath.resolve(originalFilename); file.transferTo(filePath); return ResponseEntity.ok("File uploaded: " + originalFilename); } catch (IOException e) { return ResponseEntity.status(500).body("File upload failed"); } } } ``` 该方法可结合前端上传机制,实现录制视频的统一管理与回放 [^3]。 --- ### 3.2 总结与扩展建议 WebRTC 视频流的录制可以通过浏览器端或服务器端实现。浏览器端使用 `MediaRecorder` 可实现简单录制与本地保存,适用于轻量级应用;服务器端则通过 SFU 架构(如 Kurento、Janus)实现集中录制与存储,适合企业级视频会议系统。Java 可通过集成 SFU SDK 与后端文件管理模块,实现完整的录制、存储与回放流程 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值