123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- <template>
- <div id="detailInfo">
- <el-row>
- <el-col :span="24" class="info">
- <el-col :span="14" class="left">
- <el-col :span="24" class="top">
- <el-col :span="4" class="image">
- <el-image :src="roomInfo.filedir"></el-image>
- </el-col>
- <el-col :span="20" class="title">
- <p class="one">
- <span>{{ roomInfo.title }}</span>
- <span>房间号:{{ roomInfo.name }}</span>
- </p>
- <div class="two">
- <el-col :span="16" class="select">
- <el-select v-model="cameraId" filterable placeholder="请选择摄像头">
- <el-option v-for="item in cameras" :key="item.deviceId" :label="item.label" :value="item.deviceId"> </el-option>
- </el-select>
- <el-select v-model="microphoneId" filterable placeholder="请选择麦克风">
- <el-option v-for="item in microphones" :key="item.deviceId" :label="item.label" :value="item.deviceId"> </el-option>
- </el-select>
- </el-col>
- <el-col :span="8" class="btn">
- <span @click="shareon"><i class="iconfont iconfenxiang"></i>分享</span>
- <span @click="liveon"><i class="iconfont iconshexiangtou"></i>摄像头</span>
- <span @click="liveclose">关闭</span>
- </el-col>
- </div>
- </el-col>
- </el-col>
- <el-col :span="24" class="video">
- <div id="main-video" class="video-box col-div" style="justify-content: flex-end"></div>
- </el-col>
- </el-col>
- <el-col :span="10" class="right">
- <el-col :span="24" class="chat">
- 聊天页面
- </el-col>
- </el-col>
- </el-col>
- </el-row>
- </div>
- </template>
- <script>
- import { mapState, createNamespacedHelpers } from 'vuex';
- const { mapActions: gensign } = createNamespacedHelpers('gensign');
- import TRTC from 'trtc-js-sdk';
- export default {
- name: 'detailInfo',
- props: {
- roomInfo: null,
- },
- components: {},
- data: function() {
- return {
- client_: '',
- localStream_: '',
- sdkAppId_: '1400380125',
- cameras: [],
- microphones: [],
- cameraId: '',
- microphoneId: '',
- userId_: '1111',
- open_: false,
- };
- },
- created() {
- this.initclient();
- this.getDevices();
- },
- methods: {
- ...gensign(['gensignFetch']),
- async getDevices() {
- this.cameras = await TRTC.getCameras();
- this.microphones = await TRTC.getMicrophones();
- },
- async initclient() {
- console.log(this.user.uid);
- this.userId_ = this.user.uid;
- const res = await this.gensignFetch({ userid: this.userId_ });
- if (this.$checkRes(res)) {
- console.log(res.data);
- this.client_ = TRTC.createClient({
- mode: 'live',
- sdkAppId: this.sdkAppId_,
- userId: this.userId_,
- userSig: res.data,
- });
- }
- },
- async liveon() {
- this.open_ = true;
- console.log('8888--' + this.userId_);
- if (this.cameraId === '' || this.microphoneId === '') {
- this.$message({
- message: '请选择摄像头和麦克风',
- type: 'warning',
- });
- return;
- }
- await this.client_.join({ roomId: this.name, role: 'anchor' });
- this.localStream_ = await TRTC.createStream({
- audio: true,
- video: true,
- cameraId: this.cameraId,
- microphoneId: this.microphoneId,
- userId: this.userId_,
- });
- await this.localStream_.initialize();
- console.log('initialize local stream success');
- // publish the local stream
- await this.client_.publish(this.localStream_);
- this.localStream_.play('main-video');
- //$('#mask_main').appendTo($('#player_' + this.localStream_.getId()));
- },
- async shareon() {
- const shareId = 'share-' + this.userId_;
- const res = await this.gensignFetch({ userid: shareId });
- if (this.$checkRes(res)) {
- const shareClient = TRTC.createClient({
- mode: 'videoCall',
- sdkAppId: this.sdkAppId_,
- userId: shareId,
- userSig: res.data,
- });
- shareClient.setDefaultMuteRemoteStreams(true);
- await shareClient.join({ roomId: this.name });
- const localStream = TRTC.createStream({ audio: false, screen: true });
- await localStream.initialize();
- console.log('initialize share stream success');
- await shareClient.publish(localStream);
- this.client_.on('stream-added', event => {
- const remoteStream = event.stream;
- const remoteUserId = remoteStream.getUserId();
- if (remoteUserId === shareId) {
- // 取消订阅自己的屏幕分享流
- this.client_.unsubscribe(remoteStream);
- } else {
- // 订阅其他一般远端流
- this.client_.subscribe(remoteStream);
- }
- });
- }
- },
- async liveclose() {
- // 关闭视频通话
- console.log(this.open_);
- if (this.open_) {
- const videoTrack = this.localStream_.getVideoTrack();
- if (videoTrack) {
- this.localStream_.removeTrack(videoTrack).then(() => {
- console.log('remove video call success');
- // 关闭摄像头
- videoTrack.stop();
- this.client_.unpublish(localStream).then(() => {
- // 取消发布本地流成功
- });
- });
- }
- }
- },
- },
- computed: {
- ...mapState(['user']),
- id() {
- return this.$route.query.id;
- },
- name() {
- return this.$route.query.name;
- },
- pageTitle() {
- return `${this.$route.meta.title}`;
- },
- },
- metaInfo() {
- return { title: this.$route.meta.title };
- },
- };
- </script>
- <style lang="less" scoped>
- .info {
- border-style: double;
- border-color: #ff0000 #00ff00 #0000ff rgb(250, 0, 255);
- padding: 20px;
- .left {
- background-color: #f5f5f5;
- min-height: 800px;
- border: 1px solid blueviolet;
- .top {
- position: relative;
- border: 1px solid red;
- padding: 10px;
- .image {
- text-align: center;
- .el-image {
- width: 80px;
- height: 80px;
- border-radius: 90px;
- }
- }
- .title {
- .one {
- padding: 0 0 10px 0;
- span {
- display: inline-block;
- width: 50%;
- }
- span:last-child {
- text-align: right;
- }
- }
- .two {
- position: absolute;
- right: 10px;
- bottom: 10px;
- .select {
- .el-select {
- float: left;
- width: 47%;
- margin: 0 10px 0 0;
- }
- }
- .btn {
- height: 40px;
- line-height: 40px;
- text-align: right;
- span {
- margin: 0 10px 0 0;
- }
- span:last-child {
- margin: 0;
- }
- span:hover {
- cursor: pointer;
- }
- }
- }
- }
- }
- }
- .right {
- width: 39%;
- min-height: 800px;
- border: 1px solid cyan;
- margin: 0 0 0 20px;
- }
- #main-video {
- float: left;
- width: 100%;
- height: 600px;
- min-height: 600px;
- grid-area: 1/1/3/4;
- }
- }
- </style>
|