forked from inlivedev/live-stream-app-sample
-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.mjs
153 lines (119 loc) · 3.82 KB
/
script.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// @filename: ./node_modules/@inlivedev/inlive-js-sdk/inlive-js-sdk.d.ts
import {InliveApp,InliveStream,Stream} from './node_modules/@inlivedev/inlive-js-sdk/dist/inlive-js-sdk.js'
/** @type {Stream} */
let stream
/** @type {MediaStream} */
let mediaStream
const app = InliveApp.init({
apiKey:'<YOUR_API_KEY>'
})
// create stream
async function createStream() {
try {
const streamName = document.getElementById('inputStreamName').value;
let checkName;
// random the stream name if not type in the input field
if (streamName.trim().length != '') {
checkName = streamName;
} else {
checkName = Math.random().toString(36).slice(5);
}
// request api
const btnCreate = document.querySelector('#btnCreate')
btnCreate.disabled = true
const status = document.getElementById('streamStatus')
status.innerHTML =
`<b>Creating live stream... please wait!</b>`;
stream = await InliveStream.createStream(app,{name:streamName})
btnCreate.disabled = false
document.getElementById('createContainer').style.display = 'none';
document.getElementById('mainContainer').style.display = 'flex';
document.getElementById(
'yourStream'
).innerHTML = `Stream name : <b>${streamName}</b>`;
const localStream = await attachMedia()
await prepareStream()
await initStream(localStream)
} catch (err) {
console.error(err);
document.getElementById('mainContainerError').style.display = 'flex';
document.getElementById(
'createStreamErrMessage'
).innerHTML = `<b>Something wrong!</b> <b style="color:red;">${err}</b>`;
}
}
// preparing stream
async function prepareStream() {
try {
//styling
document.getElementById('streamStatus').innerHTML =
'<b>Preparing stream ...</b>';
await stream.prepare()
} catch (err) {
console.error(err);
}
}
async function attachMedia(){
const constraints = {
video: {
frameRate: 30,
width: 1200,
height: 720,
},
audio: true,
};
const media = await InliveStream.media.getUserMedia(constraints);
const videoEl = document.querySelector('video')
media.attachTo(videoEl)
return media.stream
}
// init stream
async function initStream(localStream) {
try {
await stream.init(localStream)
//styling
document.getElementById('streamStatus').innerHTML =
'<b>Streaming is ready!</b>';
} catch (error) {
console.error(error);
throw error;
}
}
// start stream button
async function startStream() {
try {
const status = document.getElementById('streamStatus')
status.innerHTML =
`<b>Going live... please wait!</b>`;
const btnStart=document.getElementById('btnStart')
btnStart.disabled = true
await stream.live()
//styling
btnStart.style.display = 'none';
document.getElementById('btnEnd').style.display = 'block';
status.innerHTML =
`<b>Streaming is live! <a href="/live.html?id=${stream.id}" target="_blank">Click here to watch</a> </b>`;
document.getElementById(
'manifestUriLink'
).innerHTML = `<p>Dash manifest uri : ${stream.manifests.dash}</p> <p>HLS manifest uri : ${stream.manifests.hls}</p>`;
} catch (error) {
console.error(error);
throw error;
}
}
// get stream
async function getStream(streamId) {
return await InliveStream.getStream(app,streamId)
}
// end stream
async function endStream(slug) {
const status = document.getElementById('streamStatus')
status.innerHTML =`<b>Stoping live stream...</b>`;
await stream.end()
status.innerHTML =`<b>Live stream stop! Reload the page to go live again.</b>`
document.getElementById('btnEnd').style.display = 'none'
document.getElementById(
'manifestUriLink'
).style.display = 'none'
}
export {createStream, getStream, endStream, startStream,Stream}