Skip to content

Commit 2778f74

Browse files
authored
Merge pull request #129 from yydounai1234/master
release/4.2.0
2 parents 67eac1e + 188dda5 commit 2778f74

File tree

7 files changed

+87
-26
lines changed

7 files changed

+87
-26
lines changed

Demo/package-lock.json

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Demo/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"url": "git+https://github.com/pili-engineering/QNRTC-Web.git"
1212
},
1313
"scripts": {
14-
"start": "react-scripts start",
14+
"start": "NODE_OPTIONS=--openssl-legacy-provider react-scripts start",
1515
"build": "react-scripts build"
1616
},
1717
"dependencies": {
@@ -33,7 +33,7 @@
3333
"mobx": "^5.8.0",
3434
"mobx-react": "^5.4.3",
3535
"mobx-react-router": "^4.0.5",
36-
"qnweb-rtc": "^4.1.9",
36+
"qnweb-rtc": "^4.2.0",
3737
"qs": "^6.6.0",
3838
"react": "^16.8.0",
3939
"react-app-polyfill": "^0.2.0",

Demo/src/components/UserPlayer/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ interface State {
2323

2424
@observer
2525
export default class UserPlayer extends React.Component<Props, State> {
26-
26+
public ref: HTMLDivElement | undefined;
2727
handlePlayerDom(track: Track, ref: HTMLDivElement | null) {
2828
if (!ref) return;
29+
this.ref = ref;
2930
if (track.rtcTrack.mediaElement && track.rtcTrack.mediaElement.parentElement === ref) return;
3031
if (ref.innerHTML) {
3132
ref.innerHTML = '';
3233
}
33-
track.rtcTrack.play(ref).catch(e => {
34+
track.rtcTrack.play(ref, {mirror: false}).catch(e => {
3435
console.log(`mtd demo ${track.rtcTrack.isAudio() ? "audio" : "video"} track play fail`, e);
3536
this.props.addShouldResumedTrack(track);
3637
});

Demo/src/pages/home.tsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import {
1414
IconButton,
1515
Switch,
1616
ButtonBase,
17+
Select,
18+
MenuItem
1719
} from '@material-ui/core';
1820
import SettingsIcon from '@material-ui/icons/Settings';
1921
import Input from '../components/Input';
@@ -101,6 +103,7 @@ interface State {
101103
// enhance: boolean;
102104
// selected: number;
103105
joinRoomStep: number;
106+
showScreenConfig: boolean;
104107
}
105108

106109
@inject('routerStore', 'userStore', 'roomStore', 'messageStore', 'isMobile')
@@ -119,13 +122,26 @@ class Home extends Component<Props, State> {
119122
roomid: props.roomStore.id,
120123
roomToken: '',
121124
joinRoomStep: props.userStore.id ? 1 : 0,
125+
showScreenConfig: this.isShowScreenConfig(props.roomStore.selectedTrackCreateMode),
122126
};
123127
}
124128

129+
130+
private isShowScreenConfig(mode: TrackCreateMode) {
131+
return mode === TrackCreateMode.C || mode === TrackCreateMode.D;
132+
}
133+
125134
handleRadioChange = async (event: React.ChangeEvent<{}>, value: string) => {
126-
this.props.roomStore.setSelectedTrackCreateMode(value as TrackCreateMode);
135+
const mode = value as TrackCreateMode;
136+
const showScreenConfig = this.isShowScreenConfig(mode);
137+
this.props.roomStore.setSelectedTrackCreateMode(mode);
138+
this.setState({ showScreenConfig });
127139
};
128140

141+
onChangeScreenConfig = (event: React.ChangeEvent<HTMLSelectElement>) => {
142+
this.props.roomStore.setScreenConfig(event.target.value as "480p" | "720p" | "1080p");
143+
}
144+
129145
showMessage = this.props.messageStore.show;
130146

131147
verifyState = (): boolean => {
@@ -185,7 +201,23 @@ class Home extends Component<Props, State> {
185201
};
186202

187203
render() {
204+
const options = [
205+
{
206+
label: "480p(640x480 15fps 500kbps)",
207+
value: "480p"
208+
},
209+
{
210+
label: "720p(1280x720 30fps 1130kbps)",
211+
value: "720p"
212+
},
213+
{
214+
label: "1080p(1920x1080 30fps 3000kbps)",
215+
value: "1080p"
216+
}
217+
];
218+
188219
const { classes,isMobile } = this.props;
220+
const { showScreenConfig } = this.state;
189221
// const { enhance } = this.state;
190222
return (
191223
<div className={classes.root}>
@@ -272,7 +304,11 @@ class Home extends Component<Props, State> {
272304
{ !isMobile && <FormControlLabel value={TrackCreateMode.C} control={<Radio />} label={TrackCreateMode.C} />}
273305
{ !isMobile && <FormControlLabel value={TrackCreateMode.D} control={<Radio />} label={TrackCreateMode.D} />}
274306
</RadioGroup>
307+
{showScreenConfig && <Select value={this.props.roomStore.screenConfig} onChange={this.onChangeScreenConfig}>
308+
{options.map(opt => <MenuItem value={opt.value} key={opt.value}>{opt.label}</MenuItem>)}
309+
</Select>}
275310
</FormControl>
311+
276312
</Grid>
277313
</Grid>}
278314
<Grid item container wrap="nowrap" justify="center" spacing={16}>

Demo/src/pages/live/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ interface Props extends RouteComponentProps<Params> {
3838
@observer
3939
export default class LivePage extends React.Component<Props, State> {
4040
public video = React.createRef<HTMLDivElement>();;
41-
public flvPlayer?: flvjs.Player;
41+
public flvPlayer?: any;
4242
private stopRetrying?: (err?: any) => void;
4343

4444
public async componentDidMount(): Promise<void> {
@@ -68,7 +68,7 @@ export default class LivePage extends React.Component<Props, State> {
6868

6969
componentWillUnmount() {
7070
if (this.stopRetrying) this.stopRetrying();
71-
if (this.flvPlayer) this.flvPlayer.unload();
71+
if (this.flvPlayer) this.flvPlayer.destroy && this.flvPlayer.destroy();
7272
this.props.roomStore.leaveRoom();
7373
this.props.messageStore.hideLoading();
7474
}

Demo/src/pages/room.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ interface Props extends WithStyles<typeof styles> {
169169
@inject('routerStore', 'userStore', 'roomStore', 'messageStore', 'menuStore', 'isMobile')
170170
@observer
171171
class Room extends Component<Props & RouteComponentProps<RoomRouterProps>, {}> {
172+
private localTrackRef = React.createRef<UserPlayer>();
172173
componentDidMount() {
173174
document.title = `房间:${this.props.roomStore.id},appid:${this.props.roomStore.appId}`;
174175

@@ -264,6 +265,12 @@ class Room extends Component<Props & RouteComponentProps<RoomRouterProps>, {}> {
264265
});
265266
};
266267

268+
toggleCameraFacingMode = () => {
269+
if (this.localTrackRef.current && this.localTrackRef.current.ref) {
270+
this.props.roomStore.toggleCameraFacingMode(this.localTrackRef.current.ref);
271+
}
272+
};
273+
267274
selectTracks = (): Promise<RTCTrack[] | undefined> => {
268275
const { roomStore, messageStore } = this.props;
269276
return roomStore.getSelectTracks()
@@ -399,6 +406,7 @@ class Room extends Component<Props & RouteComponentProps<RoomRouterProps>, {}> {
399406
{isMobile && <div className={classes.screenMobile}>
400407
<div className={arr.length > 3 ? 'col-4 row-4' : arr.length > 1 ? 'col-6 row-6' : arr.length > 0 ? 'col-12 row-6' : 'col-12 row-12'}>
401408
<UserPlayer
409+
ref={this.localTrackRef}
402410
isMobile={isMobile}
403411
local
404412
tracks={Array.from(roomStore.publishedTracks.values())}
@@ -592,7 +600,7 @@ class Room extends Component<Props & RouteComponentProps<RoomRouterProps>, {}> {
592600
placement="top-end"
593601
>
594602
<IconButton
595-
onClick={roomStore.toggleCameraFacingMode}
603+
onClick={this.toggleCameraFacingMode}
596604
>
597605
{roomStore.facingMode === 'user' ? <PhotoCamera /> : <CameraEnhance />}
598606
</IconButton>

Demo/src/stores/roomStore.ts

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import QNRTC, {
1414
QNScreenVideoTrack,
1515
QNLocalAudioTrack,
1616
QNLocalVideoTrack,
17-
QNVideoOptimizationMode
17+
QNVideoOptimizationMode,
18+
QNCameraVideoTrack
1819
} from "qnweb-rtc";
1920
import userStore from './userStore';
2021
import { RTC_APP_ID } from '../common/api';
@@ -67,6 +68,10 @@ export class RoomStore {
6768
@observable
6869
public selectedTrackCreateMode: TrackCreateMode = TrackCreateMode.B;
6970

71+
72+
@observable
73+
public screenConfig: "480p" | "720p" | "1080p" = "1080p";
74+
7075
@observable
7176
public videoDeviceId?: string = undefined;
7277

@@ -100,7 +105,7 @@ export class RoomStore {
100105
@computed
101106
public get publishedCameraTracks(): Track[] {
102107
return Array.from(this.publishedTracks.values())
103-
.filter(v => v.rtcTrack.tag === 'camera');
108+
.filter(v => v.rtcTrack.tag === 'camera' || v.rtcTrack.tag === 'screen');
104109
}
105110

106111
/** 已发布的 VideoTrack(Screen) */
@@ -114,6 +119,11 @@ export class RoomStore {
114119
this.selectedTrackCreateMode = mode;
115120
}
116121

122+
@action
123+
public setScreenConfig(config: "480p" | "720p" | "1080p") {
124+
this.screenConfig = config;
125+
}
126+
117127
/** 切换已发布的 VideoTrack(Camera) Mute状态 */
118128
@action.bound
119129
public toggleMutePublishedCamera() {
@@ -128,12 +138,14 @@ export class RoomStore {
128138

129139
/** 切换前后置摄像头 */
130140
@action.bound
131-
public async toggleCameraFacingMode() {
141+
public async toggleCameraFacingMode(ref: HTMLDivElement) {
132142
this.setFaceingMode(this.facingMode === 'user' ? 'environment' : 'user');
133-
await this.unpublish();
134-
const rtcTracks = await this.getSelectTracks();
135-
console.log("update video facingMode repub:", rtcTracks);
136-
await this.publish(rtcTracks);
143+
const tracks = Array.from(this.publishedTracks.values()).map(t => (t.rtcTrack as QNLocalTrack));
144+
const cameraTrack = tracks.find(item => item instanceof QNCameraVideoTrack);
145+
if (cameraTrack) {
146+
await (cameraTrack as QNCameraVideoTrack).switchCamera();
147+
cameraTrack.play(ref ,{mirror: false});
148+
}
137149
}
138150
/** 切换已发布的 AudioTrack Mute状态 */
139151
@action.bound
@@ -443,7 +455,7 @@ export class RoomStore {
443455
}
444456
),
445457
(await QNRTC.createScreenVideoTrack({
446-
encoderConfig: "1080p",
458+
encoderConfig: this.screenConfig,
447459
screenVideoTag: "screen",
448460
optimizationMode: QNVideoOptimizationMode.DETAIL
449461
}) as QNScreenVideoTrack)
@@ -453,7 +465,7 @@ export class RoomStore {
453465
// 屏幕共享 + 系统声音
454466
case TrackCreateMode.D: {
455467
const ts = await QNRTC.createScreenVideoTrack({
456-
encoderConfig: "1080p",
468+
encoderConfig: this.screenConfig,
457469
optimizationMode: QNVideoOptimizationMode.DETAIL,
458470
screenAudioTag: "system-audio",
459471
screenVideoTag: "screen"
@@ -482,6 +494,10 @@ export class RoomStore {
482494
this.setLocalTracks([...this.localTracks, ...tracks]);
483495
this.publish(tracks);
484496
});
497+
} else if (track.tag === "screen") {
498+
track.on("ended", async () => {
499+
track.trackID && this.publishedTracks.delete(track.trackID);
500+
});
485501
}
486502
}
487503
}

0 commit comments

Comments
 (0)