内网开发

This commit is contained in:
2023-10-26 21:02:51 +08:00
parent 368ca335fe
commit 4e190cec87
308 changed files with 7135 additions and 2175 deletions

View File

@@ -1,47 +1,136 @@
<template>
<div>
<h1>call_room</h1>
<van-cell-group>
<van-field v-model="value" label="文本" placeholder="请输入用户名" />
</van-cell-group>
<video ref="video" id="rtc_media_player" width="310" autoplay muted controls></video>
<van-button type="primary" @click="playVideo">主要按钮</van-button>
<div class="wrapper">
<video ref="videoStreamtopVideo" width="100%" autoplay muted controls></video>
<div class="swiper-container">
<div class="swiper-wrapper">
<template v-for="(item,index) in videoRoomSteamList">
<div :key="item.webrtcUrl" class="swiper-slide">
<video class="remoteVideo" :ref="'videoStream'+item.publishId" width="100%" autoplay
@click="videoClickAction(item.publishId)"></video>
</div>
</template>
</div>
</div>
</div>
<!-- <video ref="localVideo" id="rtc_media_local_player" width="310" autoplay muted controls></video>-->
<!-- <van-button type="primary" @click="playVideo">主要按钮</van-button>-->
<!-- <van-button type="primary" @click="beginPublish">开始推流</van-button>-->
</div>
</template>
<script>
import axios from "axios";
import Swiper from 'swiper'; // 注意引入的是Swiper
import 'swiper/css/swiper.min.css' // 注意这里的引入
/* eslint-disable */
export default {
name: "call_room",
data() {
return {
value:"webrtc://119.45.242.222/live/livestream123",
value: "webrtc://119.45.242.222/live/livestream123",
isPublish: 0,
isPlayer: 0,
uid: 0,
roomId: 0,
roomTimer: null,
topVideo: "",
videoRoomSteamList: [],
oldVideoStreamList: [],
swiperInstance: null,
};
},
mounted() {
let player = new SrsRtcPlayerAsync();
var url = 'webrtc://119.45.242.222/live/livestream123';
this.isPublish = this.$route.query.isPublish;
this.isPlayer = this.$route.query.isPlayer;
this.uid = this.$route.query.uid;
this.roomId = this.$route.query.room;
this.topVideo = this.uid;
player.play(url).then(function(session){
console.log(session);
// ui.children('#peer').text('Peer: ' + url);
// video.prop('muted', false);
}).catch(function (reason) {
// player.close();
// video.hide();
console.error(reason);
});
if (this.isPublish == 1) {
this.beginPublish()
}
if (this.isPlayer == 1) {
this.roomTimer = setInterval(() => {
this.getRoomVideoList();
}, 2000)
}
this.swiperInstance = new Swiper('.swiper-container', {
slidesPerView: 4,
spaceBetween: 30,
observer: true,
on: {},
})
},
beforeDestroy() {
clearInterval(this.roomTimer);
this.roomTimer = null;
this.leaveRoom();
},
methods: {
playVideo(){
let sdk=null;
const video = this.$refs.video;
video.srcObject=null;
beginPublish() {
let _this = this;
//http://localhost:8080/hd-glasses-app/#/call_room?isPublish=1&isPlayer=1&uid=123&room=call_room
// var query = parse_query_string();
const publistUrl = process.env.VUE_APP_SRS_URL + this.roomId + "/" + this.uid;
// srs_init_rtc("#txt_url", publistUrl);
//初始化sdk
let sdk = null;
if (sdk) {
sdk.close();
}
sdk = new SrsRtcPublisherAsync();
//绑定本地视频流
// const localVideo = this.$refs.localVideo;
// localVideo.srcObject = null;
// localVideo.srcObject = sdk.stream;
sdk.publish(publistUrl).then((session) => {
_this.joinRoom()
}).catch(function (reason) {
console.error(reason)
// Throw by sdk.
// See https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#exceptions
if (reason instanceof DOMException) {
if (reason.name === 'NotFoundError') {
alert(`找不到麦克风和摄像头设备getUserMedia ${reason.name} ${reason.message}`);
} else if (reason.name === 'NotAllowedError') {
alert(`你禁止了网页访问摄像头和麦克风getUserMedia ${reason.name} ${reason.message}`);
} else if (['AbortError', 'NotAllowedError', 'NotFoundError', 'NotReadableError', 'OverconstrainedError', 'SecurityError', 'TypeError'].includes(reason.name)) {
alert(`getUserMedia ${reason.name} ${reason.message}`);
}
}
sdk.close();
console.error(reason);
});
},
playVideo(publishId = "", url = "") {
let sdk = null;
let video = null;
// const _key=`${}`
video = eval('this.$refs.videoStream' + publishId)[0]
// const video = this.$refs[_key];
if (video.srcObject != null) {
return false;
}
// console.warn(video.srcObject )
// console.warn(video.srcObject )
// console.warn(video.srcObject )
// console.warn(video.srcObject )
// console.warn(video.srcObject )
var query = parse_query_string();
srs_init_rtc("#txt_url", this.value);
if (sdk) {
@@ -49,8 +138,14 @@ export default {
}
sdk = new SrsRtcPlayerAsync();
// https://webrtc.org/getting-started/remote-streams
this.rtcSteam=sdk.stream
if (this.topVideo == publishId) {
const topVideo = this.$refs.videoStreamtopVideo
topVideo.srcObject = sdk.stream;
topVideo.onloadedmetadata = function (e) {
topVideo.play();
};
}
video.srcObject = sdk.stream;
video.onloadedmetadata = function (e) {
@@ -62,8 +157,8 @@ export default {
// sdk.ontrack = function (event) { console.log('Got track', event); sdk.stream.addTrack(event.track); };
// For example: webrtc://r.ossrs.net/live/livestream
var url = this.value
sdk.play(url).then(function(session){
// var url = this.value
sdk.play(url).then(function (session) {
// $('#sessionid').html(session.sessionid);
// $('#simulator-drop').attr('href', session.simulator + '?drop=1&username=' + session.sessionid);
}).catch(function (reason) {
@@ -72,11 +167,126 @@ export default {
console.error(reason);
});
},
getRoomVideoList() {
axios({
method: "post",
url: process.env.VUE_APP_IM_API_URL + "/room/getRoomInfo",
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
// mode: 'no-cors',
data: {
roomId: this.roomId
},
}).then(res => {
if (res.status == 200) {
this.generateVideoRoomStream(res.data.data)
}
})
},
leaveRoom() {
axios({
method: "post",
url: process.env.VUE_APP_IM_API_URL + "/room/leaveRoom",
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
data: {
roomId: this.roomId,
publishId: this.uid,
type: 'webrtc'
},
}).then(res => {
console.log(res)
})
},
joinRoom() {
axios({
method: "post",
url: process.env.VUE_APP_IM_API_URL + "/room/joinRoom",
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
// mode: 'no-cors',
data: {
roomId: this.roomId,
publishId: this.uid,
type: 'webrtc',
webrtcUrl: process.env.VUE_APP_SRS_URL + this.roomId + "/" + this.uid
},
}).then(res => {
console.log(res)
})
},
generateVideoRoomStream(videoList) {
let hasUpdate = false;
if (this.oldVideoStreamList == null) {
this.oldVideoStreamList = videoList;
} else {
if (JSON.stringify(this.oldVideoStreamList) != JSON.stringify(videoList)) {
hasUpdate = true
}
}
this.oldVideoStreamList = videoList;
this.videoRoomSteamList = videoList;
setTimeout(() => {
videoList.map((item) => {
this.playVideo(item.publishId, item.webrtcUrl)
})
if (hasUpdate) {
this.swiperInstance.update();
console.log("数据有变化更新swipper")
//视频流有变化,检查置顶用户是否以及走掉
this.updateTopVideoStream();
}
}, 1000)
//videoSteamList
},
videoClickAction(publishId) {
this.topVideo = publishId;
var video = eval('this.$refs.videoStream' + publishId)[0]
console.log(video.srcObject)
this.$refs.videoStreamtopVideo.srcObject = video.srcObject;
},
//讲列表有人下线判断top流是否正常如果不正常则把列表第一个移到Top
updateTopVideoStream() {
console.log(this.$refs.videoStreamtopVideo.srcObject)
let topVideo = this.oldVideoStreamList.find(item => item.publishId == this.topVideo)
//如果置顶用户已经走掉,则把用户自己的视频置顶
if (topVideo == undefined) {
var video = eval('this.$refs.videoStream' + this.uid)[0]
this.$refs.videoStreamtopVideo.srcObject = video.srcObject;
}
}
}
}
</script>
<style scoped>
<style lang="less">
.slide {
height: 200px;
width: 200px;
}
.swiper-slide {
background: #000000;
width: 200px;
height: 180px;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
margin-right: 20px;
.remoteVideo {
width: 100%;
height: auto;
}
}
</style>