Stop using setCodecPreferences() as it causes stuttering on Chromium 124+

This commit is contained in:
redphx
2024-07-01 17:22:24 +07:00
parent 7aee4d5148
commit 889a97e56b
4 changed files with 69 additions and 36 deletions

View File

@@ -1,5 +1,59 @@
export function setCodecPreferences(sdp: string, preferredCodec: string) {
const h264Pattern = /a=fmtp:(\d+).*profile-level-id=([0-9a-f]{6})/g;
const profilePrefix = preferredCodec === 'high' ? '4d' : (preferredCodec === 'low' ? '420' : '42e');
const preferredCodecIds: string[] = [];
// Find all H.264 codec profile IDs
const matches = sdp.matchAll(h264Pattern) || [];
for (const match of matches) {
const id = match[1];
const profileId = match[2];
if (profileId.startsWith(profilePrefix)) {
preferredCodecIds.push(id);
}
}
// No preferred IDs found
if (!preferredCodecIds.length) {
return sdp;
}
const lines = sdp.split('\r\n');
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
const line = lines[lineIndex];
if (!line.startsWith('m=video')) {
continue;
}
// https://datatracker.ietf.org/doc/html/rfc4566#section-5.14
// m=<media> <port> <proto> <fmt>
// m=video 9 UDP/TLS/RTP/SAVPF 127 39 102 104 106 108
const tmp = line.trim().split(' ');
// Get array of <fmt>
// ['127', '39', '102', '104', '106', '108']
let ids = tmp.slice(3);
// Remove preferred IDs in the original array
ids = ids.filter(item => !preferredCodecIds.includes(item));
// Put preferred IDs at the beginning
ids = preferredCodecIds.concat(ids);
// Update line's content
lines[lineIndex] = tmp.slice(0, 3).concat(ids).join(' ');
break;
}
return lines.join('\r\n');
}
export function patchSdpBitrate(sdp: string, video?: number, audio?: number) {
const lines = sdp.split('\n');
const lines = sdp.split('\r\n');
const mediaSet: Set<string> = new Set();
!!video && mediaSet.add('video');
@@ -57,5 +111,5 @@ export function patchSdpBitrate(sdp: string, video?: number, audio?: number) {
}
}
return lines.join('\n');
return lines.join('\r\n');
}