前端

import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
import { MediaDevicesService } from '../../media-devices.service';
import * as io from 'socket.io-client';
import { MESSAGE_EVENT } from '@live-video-example/p2p'; @Component({
selector: 'live-video-example-get-audio',
templateUrl: './get-audio.component.html',
styleUrls: ['./get-audio.component.styl'],
})
export class GetAudioComponent implements OnInit {
constructor(private readonly mediaDevicesService: MediaDevicesService) {} @ViewChild('audio')
audioRef: ElementRef<HTMLAudioElement>; localStream: MediaStream;
mr: MediaRecorder;
recordedChunks: any[] = [];
private socket?: SocketIOClient.Socket; isStart = false; async ngOnInit() {
await this._initLocalStream();
await this._initSocket();
// await this.ngAfterViewInit();
await this._initMr();
}
private _initSocket() {
this.socket = io(`https://dev.ajanuw.com:3333/audio`); this.socket.on(MESSAGE_EVENT, (data) => {
this.saveFile(
new Blob([data.audio], {
type: data.type,
})
);
});
} private async _initLocalStream() {
this.localStream = await this.mediaDevicesService.getUserMedia({
audio: true,
});
} private async _initMr() {
this.mr = new MediaRecorder(this.localStream);
this.mr.addEventListener('dataavailable', (e: any) => {
if (e.data.size > 0) this.recordedChunks.push(e.data);
}); this.mr.addEventListener('stop', () => {
const type = 'audio/mp3; codecs=opus';
const blob = new Blob(this.recordedChunks, {
type,
});
this._sendServer(blob, type);
});
} saveFile(blob: Blob) {
const downloadLink = document.createElement('a');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = 'acetest.mp3';
downloadLink.click();
} ngAfterViewInit(): void {
if (!this.localStream) return;
this.audioRef.nativeElement.srcObject = this.localStream;
} download() {
this.isStart = false; this.mr.stop();
} start() {
this.isStart = true;
this.mr.start();
} /**
* 将录制的audio blob发送给服务器
*/
private async _sendServer(audio: Blob, type: string) {
this.socket.emit(MESSAGE_EVENT, { audio, type });
}
}

服务器

import {
SubscribeMessage,
WebSocketGateway,
WebSocketServer,
OnGatewayConnection,
OnGatewayDisconnect,
} from '@nestjs/websockets';
import { Socket } from 'socket.io';
import { MESSAGE_EVENT } from '@live-video-example/p2p'; @WebSocketGateway({ namespace: 'audio' })
export class AudioGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Socket; handleDisconnect(client: Socket) {} handleConnection(client: Socket, ...args: any[]) {} @SubscribeMessage(MESSAGE_EVENT)
onMessage(client: Socket, payload: any): any {
console.log(payload); client.emit(MESSAGE_EVENT, payload);
}
}

js 使用socket-io发送文件的更多相关文章

  1. Node.js 和Socket.IO 实现chat WEBIM

    socket官方:   http://socket.io/  需求:实现WEB IM功能,数据从服务器PUSH  不是PULL  websocket是基于HTML5的新特性,不兼容IE6,7,8 .. ...

  2. 使用Node.js的socket.io模块开发实时web程序

    首发:个人博客,更新&纠错&回复 今天的思维漫游如下:从.net的windows程序开发,摸到nodejs的桌面程序开发,又熟悉了一下nodejs,对“异步”的理解有了上上周对操作系统 ...

  3. node.js和socket.io纯js实现的即时通讯实例分享

    在这个例子中,其实node.js并没有真正起到服务器的作用,因为我们这里可以直接运行client.html文件,而不用输入url请求,当 然,要想输入url请求页面内容还需要加入请求静态文件的代码.这 ...

  4. node.js和socket.io实现im

    im——Instant Messaging 即时通讯 基本技术原理 (1)通过IM服务器登陆或注销 (2)用户A通过列表找到B,用户B获得消息并与之交谈 (3)通过IM服务器指引建立与B单独的通讯通道 ...

  5. 利用Socket远程发送文件

    思想: 1.注意使用两个通道,一个普通对象通信通道,另一个纯净的文件字节流通道 2.利用通信通道发送文件请求,新建字节流通道,开始发送文件

  6. [Node.js] 基于Socket.IO 的私聊

    原文地址:http://www.moye.me/2015/01/02/node_socket-io/ 引子 最近听到这么一个问题:Socket.IO 怎么实现私聊?换个提法:怎么定位到人(端),或者说 ...

  7. Socket.io发送消息含义

    仅作收藏:转自博客园 若相忆; // send to current request socket client socket.emit('message', "this is a test ...

  8. socket.io发送给指定的客户端

    http://www.cnblogs.com/ajccom/archive/2013/07/18/3197809.html http://stackoverflow.com/questions/100 ...

  9. 05 Node.js学习笔记之发送文件数据

    这章学习在NodeJs中如何将Html文件发送到客户端上,以及定义Content-Type内容类型 //1.载入http和fs模块 var http=require("http") ...

  10. 使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

随机推荐

  1. 扒一扒ELF文件

    ELF文件(Executable Linkable Format)是一种文件存储格式.Linux下的目标文件和可执行文件都按照该格式进行存储,有必要做个总结. 目录 1. 链接举例 2. ELF文件类 ...

  2. Jmeter(三十七) - 从入门到精通进阶篇 - 输出HTML格式的性能测试报告(详解教程)

    1.简介 相对于Loadrunner,Jmeter其实也是可以有测试报告产出的,虽然一般都不用(没有Loadrunner的报告那么强大是一方面),但是有小伙伴们私下问,那宏哥还是顺手写一下吧,今天我们 ...

  3. mysql、sql server、oracle大比较

    MYSQL 多个数据库多个用户形式(最好每个数据库对应一个用户),占用内存小,适用于所有平台,开源免费 客户端和命令窗口,都是由数据库决定内容-> use datebase; 组函数在selec ...

  4. Redis集群搭建,伪分布式集群,即一台服务器6个redis节点

    Redis集群搭建,伪分布式集群,即一台服务器6个redis节点 一.Redis Cluster(Redis集群)简介 集群搭建需要的环境 二.搭建集群 2.1Redis的安装 2.2搭建6台redi ...

  5. Cookie (设置与读取、超时设置、指定路径、显示用户上次登录时间)

    Cooike简介 Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的 ...

  6. 输入DStream之基础数据源以及基于HDFS的实时wordcount程序

    输入DStream之基础数据源以及基于HDFS的实时wordcount程序 一.Java方式 二.Scala方式 基于HDFS文件的实时计算,其实就是,监控一个HDFS目录,只要其中有新文件出现,就实 ...

  7. linux设置用户登录提示

    1./etc/motd文件的用途          /etc/motd即message of today(布告栏信息),每次用户登录时,/etc/motd文件的内容会显示在用户的终端.         ...

  8. 误删eth1或者 eth0

    不小心把机房,eth1删除了,过2天还演示,折腾一下午.... 首先eth1存在地方是2块./etc/sysconfig/network-scripts/下 /et/sysconfig/network ...

  9. ceph --- (简单操作及openstack交接)

    部署ceph :https://www.cnblogs.com/cloudhere/p/10519647.html Centos7部署ceph:https://www.cnblogs.com/kevi ...

  10. AtCoder Beginner Contest 162

    比赛链接:https://atcoder.jp/contests/abc162/tasks A - Lucky 7 #include <bits/stdc++.h> using names ...