mirror of
https://github.com/davedoesdev/streamana.git
synced 2025-12-24 13:28:19 +08:00
Remove redundant code
This commit is contained in:
230
site/hls.js
230
site/hls.js
@@ -1,3 +1,9 @@
|
||||
// TODO if an error occurs after starting worker do we always close/terminate it?
|
||||
// it seems to keep running
|
||||
// but we still get to terminate it because Go Live button remains on
|
||||
// ONLY if error occurs in promise
|
||||
// if only one stream, switch back to stdin only?
|
||||
|
||||
const audioBitsPerSecond = 128 * 1000;
|
||||
const videoBitsPerSecond = 2500 * 1000;
|
||||
const key_frame_interval = 10;
|
||||
@@ -52,230 +58,6 @@ export class HLS extends EventTarget {
|
||||
this.media_recorder('video/mp4');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const video_worker = new Worker('./video-worker.js');
|
||||
video_worker.onerror = onerror;
|
||||
video_worker.onmessage = e => {
|
||||
const msg = e.data;
|
||||
switch (msg.type) {
|
||||
case 'video-data':
|
||||
this.webm_worker.postMessage(msg, [msg.data]);
|
||||
break;
|
||||
case 'error':
|
||||
onerror(msg.detail);
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
const audio_worker = new Worker('./audio-worker.js');
|
||||
audio_worker.onerror = onerror;
|
||||
audio_worker.onmessage = e => {
|
||||
const msg = e.data;
|
||||
switch (msg.type) {
|
||||
case 'audio-data':
|
||||
this.webm_worker.postMessage(msg, [msg.data]);
|
||||
this.dispatchEvent(new CustomEvent('update'));
|
||||
break;
|
||||
case 'error':
|
||||
onerror(msg.detail);
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
this.webm_worker = new Worker('./webm-worker.js');
|
||||
this.webm_worker.onerror = onerror;
|
||||
this.webm_worker.onmessage = e => {
|
||||
const msg = e.data;
|
||||
switch (msg.type) {
|
||||
case 'exit':
|
||||
this.webm_worker.terminate();
|
||||
this.webm_worker = null;
|
||||
video_worker.terminate();
|
||||
audio_worker.terminate();
|
||||
break;
|
||||
case 'start-stream':
|
||||
video_worker.postMessage({
|
||||
type: 'start',
|
||||
readable: video_readable,
|
||||
config: {
|
||||
codec: 'avc1.42E01E', // 'avc1.42001E'
|
||||
bitrate: videoBitsPerSecond,
|
||||
width: video_settings.width,
|
||||
height: video_settings.height,
|
||||
avc: {
|
||||
format: 'annexb'
|
||||
}
|
||||
}
|
||||
}, [video_readable]);
|
||||
audio_worker.postMessage({
|
||||
type: 'start',
|
||||
readable: audio_readable,
|
||||
/*config: {
|
||||
codec: 'opus',
|
||||
bitrate: audioBitsPerSecond,
|
||||
sampleRate: audio_settings.sampleRate,
|
||||
numberOfChannels: audio_settings.channelCount
|
||||
}*/
|
||||
}, [audio_readable]);
|
||||
break;
|
||||
case 'error':
|
||||
onerror(msg.detail);
|
||||
break;
|
||||
}
|
||||
this.dispatchEvent(new CustomEvent(msg.type, { detail: msg.data }));
|
||||
};
|
||||
|
||||
this.webm_worker.postMessage({
|
||||
type: 'start',
|
||||
ffmpeg_lib_url: this.ffmpeg_lib_url,
|
||||
ffmpeg_args: [
|
||||
//'-use_wallclock_as_timestamps', '1',
|
||||
'-i', '/work/stream1',
|
||||
//'-f', 'f32le',
|
||||
//'-ac', audio_settings.channelCount.toString(),
|
||||
//'-ar', audio_settings.sampleRate.toString(),
|
||||
//'-i', '/work/stream2',
|
||||
'-map', '0:v',
|
||||
'-map', '0:a',
|
||||
'-c:v', 'copy', // pass through the video data (h264, no decoding or encoding)
|
||||
/*...(recorder.mimeType === 'video/mp4' ?
|
||||
['-c:a', 'copy'] : // assume already AAC
|
||||
['-c:a', 'aac', // re-encode audio as AAC-LC
|
||||
'-b:a', '128k']), // set audio bitrate*/
|
||||
'-c:a', 'aac', // re-encode audio as AAC-LC
|
||||
'-ab', audioBitsPerSecond.toString() // set audio bitrate
|
||||
],
|
||||
base_url: this.base_url,
|
||||
webm_metadata: {
|
||||
max_segment_duration: BigInt(1000000000),
|
||||
video: {
|
||||
width: video_settings.width,
|
||||
height: video_settings.height,
|
||||
frame_rate: video_settings.frameRate,
|
||||
codec_id: 'V_MPEG4/ISO/AVC'
|
||||
},
|
||||
audio: {
|
||||
sample_rate: audio_settings.sampleRate,
|
||||
channels: audio_settings.channelCount,
|
||||
bit_depth: 32,
|
||||
codec_id: 'A_PCM/FLOAT/IEEE'
|
||||
//codec_id: 'A_OPUS'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return;
|
||||
|
||||
// also if an error occurs after starting worker do we always close/terminate it?
|
||||
// it seems to keep running
|
||||
// but we still get to terminate it because Go Live button remains on
|
||||
// ONLY if error occurs in promise
|
||||
// if only one stream, switch back to stdin only?
|
||||
|
||||
// start ffmpeg in a Web Worker
|
||||
this.worker = new Worker(ffmpeg_lib_url);
|
||||
this.worker.onerror = onerror;
|
||||
this.worker.onmessage = e => {
|
||||
const msg = e.data;
|
||||
switch (msg.type) {
|
||||
case 'ready':
|
||||
this.worker.postMessage({
|
||||
type: 'run',
|
||||
arguments: [
|
||||
'-loglevel', 'debug',
|
||||
'-use_wallclock_as_timestamps', '1',
|
||||
'-i', '/work/stream1', // fd 3 in worker
|
||||
'-f', 'f32le',
|
||||
'-ac', '1',
|
||||
'-ar', '48000',
|
||||
'-use_wallclock_as_timestamps', '1',
|
||||
'-i', '/work/stream2', // fd 4 in worker
|
||||
'-map', '0:v',
|
||||
'-map', '1:a',
|
||||
'-f', 'hls', // use hls encoder
|
||||
'-c:v', 'copy', // pass through the video data (h264, no decoding or encoding)
|
||||
/*...(recorder.mimeType === 'video/mp4' ?
|
||||
['-c:a', 'copy'] : // assume already AAC
|
||||
['-c:a', 'aac', // re-encode audio as AAC-LC
|
||||
'-b:a', '128k']), // set audio bitrate*/
|
||||
'-c:a', 'aac', // re-encode audio as AAC-LC
|
||||
'-b:a', '128k', // set audio bitrate
|
||||
'-hls_time', '2', // 2 second HLS chunks
|
||||
'-hls_segment_type', 'mpegts', // MPEG2-TS muxer
|
||||
'-hls_list_size', '2', // two chunks in the list at a time
|
||||
'-hls_flags', 'split_by_time',
|
||||
'/outbound/output.m3u8' // path to media playlist file in virtual FS,
|
||||
// must be under /outbound
|
||||
],
|
||||
MEMFS: [
|
||||
{ name: 'stream1' },
|
||||
{ name: 'stream2' }
|
||||
]
|
||||
});
|
||||
break;
|
||||
case 'stdout':
|
||||
console.log(msg.data);
|
||||
break;
|
||||
case 'stderr':
|
||||
console.error(msg.data);
|
||||
break;
|
||||
case 'start-video':
|
||||
this.worker.postMessage({
|
||||
type: 'base-url',
|
||||
data: ingestion_url
|
||||
});
|
||||
// start recording; produce data every second, we'll be chunking it anyway
|
||||
//recorder.start(1000);
|
||||
//
|
||||
|
||||
encode(stream.getVideoTracks()[0],
|
||||
VideoEncoder,
|
||||
{
|
||||
codec: 'avc1.42E01E', // 'avc1.42001E'
|
||||
bitrate: videoBitsPerSecond,
|
||||
width,
|
||||
height,
|
||||
avc: {
|
||||
format: 'annexb'
|
||||
}
|
||||
},
|
||||
this.worker,
|
||||
'stream1');
|
||||
|
||||
encode(stream.getAudioTracks()[0],
|
||||
AudioEncoder,
|
||||
{
|
||||
//codec: 'mp4a.40.2',
|
||||
codec: 'opus',
|
||||
bitrate: audioBitsPerSecond,
|
||||
sampleRate: 48000,
|
||||
numberOfChannels: 1
|
||||
},
|
||||
this.worker,
|
||||
'stream2');
|
||||
|
||||
break;
|
||||
case 'exit':
|
||||
exited = true;
|
||||
this.worker.terminate();
|
||||
/*if (recorder.state !== 'inactive') {
|
||||
recorder.stop();
|
||||
}*/
|
||||
break;
|
||||
}
|
||||
this.dispatchEvent(new CustomEvent(msg.type, { detail: msg.data }));
|
||||
};
|
||||
}
|
||||
|
||||
media_recorder(mimeType) {
|
||||
|
||||
Reference in New Issue
Block a user