diff --git a/app/src/Room.js b/app/src/Room.js index 6a271abe..be9a2e26 100644 --- a/app/src/Room.js +++ b/app/src/Room.js @@ -30,6 +30,7 @@ module.exports = class Room { }; this.survey = config.survey; this.redirect = config.redirect; + this.prioritize_H264 = config.recording.prioritize_H264; this.peers = new Map(); this.router = null; this.createTheRouter(); @@ -162,6 +163,7 @@ module.exports = class Room { moderator: this._moderator, survey: this.survey, redirect: this.redirect, + prioritize_H264: this.prioritize_H264, peers: JSON.stringify([...this.peers]), }; } diff --git a/app/src/Server.js b/app/src/Server.js index 915a089f..3dc4ae28 100644 --- a/app/src/Server.js +++ b/app/src/Server.js @@ -509,6 +509,7 @@ function startServer() { slack_enabled: slackEnabled, stats_enabled: config.stats.enabled, chatGPT_enabled: config.chatGPT.enabled, + rec_prioritize_H264: config.recording.prioritize_H264, }); } catch (err) { log.error('Ngrok Start error: ', err.body); @@ -554,6 +555,7 @@ function startServer() { slack_enabled: slackEnabled, stats_enabled: config.stats.enabled, chatGPT_enabled: config.chatGPT.enabled, + rec_prioritize_H264: config.recording.prioritize_H264, }); }); diff --git a/app/src/config.template.js b/app/src/config.template.js index 42b25729..28833202 100644 --- a/app/src/config.template.js +++ b/app/src/config.template.js @@ -149,6 +149,9 @@ module.exports = { enabled: false, url: '', }, + recording: { + prioritize_H264: false, // Give priority to h264,aac|h264,opus instead of vp8,opus/vp9,opus codec + }, stats: { /* Umami: https://github.com/umami-software/umami diff --git a/public/js/Room.js b/public/js/Room.js index cf7b8e82..59a4a704 100644 --- a/public/js/Room.js +++ b/public/js/Room.js @@ -33,6 +33,8 @@ let redirect = { url: '/newroom', }; +let recCodecs = null; + const _PEER = { presenter: '', guest: '', diff --git a/public/js/RoomClient.js b/public/js/RoomClient.js index 3e190d82..670b941c 100644 --- a/public/js/RoomClient.js +++ b/public/js/RoomClient.js @@ -235,7 +235,9 @@ class RoomClient { this.fileSharingInput = '*'; this.chunkSize = 1024 * 16; // 16kb/s + // Recording this.audioRecorder = null; + this.recPrioritizeH264 = false; // Encodings this.forceVP8 = false; // Force VP8 codec for webcam and screen sharing @@ -376,6 +378,8 @@ class RoomClient { survey = room.survey; console.log('07.0 ----> Room Leave Redirect', room.redirect); redirect = room.redirect; + console.log('07.0 ----> Room REC prioritize_H264', room.prioritize_H264); + this.recPrioritizeH264 = room.prioritize_H264; let peers = new Map(JSON.parse(room.peers)); participantsCount = peers.size; // ME @@ -3735,13 +3739,14 @@ class RoomClient { } getSupportedMimeTypes() { - const possibleTypes = [ - 'video/webm;codecs=vp9,opus', - 'video/webm;codecs=vp8,opus', - 'video/webm;codecs=h264,opus', + const possibleTypes = ['video/webm;codecs=vp9,opus', 'video/webm;codecs=vp8,opus', 'video/mp4']; + possibleTypes.splice( + this.recPrioritizeH264 ? 0 : 2, + 0, 'video/mp4;codecs=h264,aac', - 'video/mp4', - ]; + 'video/webm;codecs=h264,opus', + ); + console.log('POSSIBLE CODECS', possibleTypes); return possibleTypes.filter((mimeType) => { return MediaRecorder.isTypeSupported(mimeType); }); @@ -3755,6 +3760,8 @@ class RoomClient { console.log('MediaRecorder supported options', supportedMimeTypes); const options = { mimeType: supportedMimeTypes[0] }; + recCodecs = supportedMimeTypes[0]; + try { this.audioRecorder = new MixedAudioRecorder(); const audioStreams = this.getAudioStreamFromAudioElements(); @@ -3946,6 +3953,7 @@ class RoomClient {