Remove redundant code

This commit is contained in:
David Halls
2021-07-06 08:38:34 +01:00
parent 7e4212f448
commit e18f574277

View File

@@ -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) {