123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- import { Injectable } from '@angular/core';
- import * as Parse from 'parse';
- import { AiChatService } from './aichart.service';
- import { HttpService } from './http.service';
- declare const AgoraRTC: any;
- @Injectable({
- providedIn: 'root',
- })
- export class LiveService {
- options: {
- appid: string;
- channel: string;
- token: string;
- } = {
- appid: '71d3357d920d4352b39ec8b8d26a7cb9',
- channel: '',
- token: '',
- };
- localTracks: any = {
- audioTrack: null,
- videoTrack: null,
- };
- rid?: string; //房间id(channel)
- profile?:any = localStorage.getItem('profile');
- client: any; //客户端
- company: string = '';
- UID:any
- constructor(private http: HttpService, private aiServ: AiChatService) {
- this.client?.leave();
- this.company = this.aiServ.company;
- this.getProfile();
- }
- async getProfile() {
- if(this.profile) return
- let queryProfile = new Parse.Query('Profile');
- queryProfile.equalTo('user', Parse.User.current()?.id);
- queryProfile.notEqualTo('isDeleted', true);
- queryProfile.equalTo('isCross', true);
- let r = await queryProfile.first();
- this.profile = r?.id
- }
- /* 初始化Agora */
- initAgora() {
- this.client = AgoraRTC.createClient({ mode: 'rtc', codec: 'h264' });
- AgoraRTC.enableLogUpload();
- }
- // 获取所有音视频设备
- getDevices() {
- AgoraRTC.getDevices()
- .then((devices: any) => {
- const audioDevices = devices.filter(function (device: any) {
- return device.kind === 'audioinput';
- });
- const videoDevices = devices.filter(function (device: any) {
- return device.kind === 'videoinput';
- });
- let selectedMicrophoneId = audioDevices[0].deviceId;
- let selectedCameraId = videoDevices[0].deviceId;
- return Promise.all([
- AgoraRTC.createCameraVideoTrack({ cameraId: selectedCameraId }),
- AgoraRTC.createMicrophoneAudioTrack({
- microphoneId: selectedMicrophoneId,
- }),
- ]);
- })
- .then((tracks: any) => {
- console.log('createCameraVideoTrack', tracks);
- })
- .catch((err: any) => {
- console.log(err);
- });
- }
- async getToken(room: Parse.Object) {
- //获取频道token记录
- if (room?.get('profile').id == this.profile) {
- this.UID = 111111
- let uid = Parse.User.current()?.id;
- if (!uid) {
- return;
- }
- let baseurl = 'https://server.fmode.cn/api/webrtc/build_token';
- let reqBody = {
- company: this.company, // this.aiSer.company,
- profile: this.profile,
- channelName: this.profile,
- };
- let data: any = await this.http.httpRequst(baseurl, reqBody, 'POST');
- console.log(data);
- if (data.code == 200) {
- this.options.token = data.data.token;
- this.options.appid = data.data.appid;
- this.options.channel = room?.get('profile').id
- }
- } else {
- let data = await this.updateToken(room?.get('profile').id);
- this.options.token = data.token;
- this.options.channel = data.channel;
- console.log(data);
- }
- }
- /* 获取token */
- async updateToken(pid: string) {
- let sql = `select "rtc"."objectId" as "rid","rtc"."channel", "rtc"."token", "rtc"."expiraTime" from "RtcToken" as "rtc" where "rtc"."profile" = '${pid}' and "rtc"."expiraTime" >= now() order by "createdAt" desc limit 1`;
- let tokenData: any = await this.http.customSQL(sql);
- if (
- tokenData &&
- tokenData.code == 200 &&
- tokenData.data &&
- tokenData.data.length > 0
- ) {
- return tokenData.data[0];
- } else {
- return null;
- }
- }
- // 进入频道
- async join() {
- let data = await Promise.all([
- this.client.join(this.options.appid, this.options.channel, this.options.token, this.UID),
- /* 创建音频和视频轨道 */
- AgoraRTC.createMicrophoneAudioTrack(),
- AgoraRTC.createCameraVideoTrack(),
- ]);
- // await this.client.setClientRole('host');
- this.localTracks.audioTrack = data[1];
- this.localTracks.videoTrack = data[2];
- let remoteEle = document.getElementById('vice-video');
- if (remoteEle) {
- remoteEle.textContent = '';
- }
- this.localTracks.videoTrack.play('vice-video'); //播放自己视频渲染
- let publish = await this.client.publish(Object.values(this.localTracks));
- this.joinReady();
- }
- /* 订阅远程视频 */
- async joinReady() {
- console.log(this.client.remoteUsers);
- let wxRemoteUsers = this.client.remoteUsers.find((item: any) => {
- if (item.uid && item._video_added_) {
- return item;
- }
- });
- console.log(wxRemoteUsers);
- this.client.on('user-joined', (user: any) => {
- console.log(user, `${user.uid} 加入频道`);
- });
- this.client.on('user-published', async (user: any, mediaType: any) => {
- console.log('用户推流成功');
- // if (user.uid == 333333) {
- await this.client.subscribe(user, mediaType);
- // }
- let remoteEle = document.getElementById('video');
- if (remoteEle) {
- remoteEle.textContent = '';
- }
- if (mediaType === 'video') {
- user.videoTrack.play(`video`);
- }
- if (mediaType === 'audio') {
- user.audioTrack.play();
- }
- });
- this.client.on('user-unpublished', (user: any) => {
- let remoteEle = document.getElementById('video');
- if (remoteEle) {
- remoteEle.textContent = '对方离开直播间';
- }
- // if (user.uid == 333333) {
- console.log('用户取消推流');
- // }
- });
- }
- }
|