diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 755e6e70e75..8c6cd686d3f 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -1028,6 +1028,48 @@ export default function (options) { profile.TranscodingProfiles.push(...flacTranscodingProfiles); } + if (safariSupportsOpus) { + const opusConditions = [ + // Safari doesn't support opus with more than 2 channels + { + Condition: 'LessThanEqual', + Property: 'AudioChannels', + Value: '2', + IsRequired: false + } + ]; + + profile.CodecProfiles.push({ + Type: 'VideoAudio', + Codec: 'opus', + Conditions: opusConditions + }); + + const opusTranscodingProfiles = []; + + // Split each video transcoding profile with opus so that the containing opus is only applied to 2 channels audio + profile.TranscodingProfiles.forEach(transcodingProfile => { + if (transcodingProfile.Type !== 'Video') return; + + const audioCodecs = transcodingProfile.AudioCodec.split(','); + + if (!audioCodecs.includes('opus')) return; + + const opusTranscodingProfile = { ...transcodingProfile }; + opusTranscodingProfile.AudioCodec = 'opus'; + opusTranscodingProfile.ApplyConditions = [ + ...opusTranscodingProfile.ApplyConditions || [], + ...opusConditions + ]; + + opusTranscodingProfiles.push(opusTranscodingProfile); + + transcodingProfile.AudioCodec = audioCodecs.filter(codec => codec != 'opus').join(','); + }); + + profile.TranscodingProfiles.push(...opusTranscodingProfiles); + } + let maxH264Level = 42; let h264Profiles = 'high|main|baseline|constrained baseline';