1
0
Fork 0
forked from External/mediamtx

webrtc: detect stereo tracks published with the web page (#2902) (#3263)

This commit is contained in:
Alessandro Ros 2024-04-17 23:41:45 +02:00 committed by GitHub
parent 9e718f9dd9
commit cfea14e8e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -307,9 +307,13 @@ const setCodec = (section, codec) => {
} }
const lines3 = []; const lines3 = [];
let firstLine = true;
for (const line of lines2) { for (const line of lines2) {
if (line.startsWith('a=fmtp:')) { if (firstLine) {
firstLine = false;
lines3.push(line.split(' ').slice(0, 3).concat(payloadFormats).join(' '));
} else if (line.startsWith('a=fmtp:')) {
if (payloadFormats.includes(line.slice('a=fmtp:'.length).split(' ')[0])) { if (payloadFormats.includes(line.slice('a=fmtp:'.length).split(' ')[0])) {
lines3.push(line); lines3.push(line);
} }
@ -368,15 +372,28 @@ const setAudioBitrate = (section, bitrate, voice) => {
return lines.join('\r\n'); return lines.join('\r\n');
}; };
const editAnswer = (sdp, videoCodec, audioCodec, videoBitrate, audioBitrate, audioVoice) => { const editOffer = (sdp) => {
const sections = sdp.split('m='); const sections = sdp.split('m=');
for (let i = 0; i < sections.length; i++) { for (let i = 0; i < sections.length; i++) {
const section = sections[i]; const section = sections[i];
if (section.startsWith('video')) { if (section.startsWith('video')) {
sections[i] = setVideoBitrate(setCodec(section, videoCodec), videoBitrate); sections[i] = setCodec(section, videoForm.codec.value);
} else if (section.startsWith('audio')) { } else if (section.startsWith('audio')) {
sections[i] = setAudioBitrate(setCodec(section, audioCodec), audioBitrate, audioVoice); sections[i] = setAudioBitrate(setCodec(section, audioForm.codec.value), audioForm.bitrate.value, audioForm.voice.checked);
}
}
return sections.join('m=');
};
const editAnswer = (sdp) => {
const sections = sdp.split('m=');
for (let i = 0; i < sections.length; i++) {
const section = sections[i];
if (section.startsWith('video')) {
sections[i] = setVideoBitrate(section, videoForm.bitrate.value);
} }
} }
@ -421,14 +438,7 @@ const onRemoteAnswer = (sdp) => {
return; return;
} }
sdp = editAnswer( sdp = editAnswer(sdp);
sdp,
videoForm.codec.value,
audioForm.codec.value,
videoForm.bitrate.value,
audioForm.bitrate.value,
audioForm.voice.checked,
);
pc.setRemoteDescription(new RTCSessionDescription({ pc.setRemoteDescription(new RTCSessionDescription({
type: 'answer', type: 'answer',
@ -442,12 +452,14 @@ const onRemoteAnswer = (sdp) => {
}; };
const sendOffer = (offer) => { const sendOffer = (offer) => {
offer = editOffer(offer);
fetch(new URL('whip', window.location.href) + window.location.search, { fetch(new URL('whip', window.location.href) + window.location.search, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/sdp', 'Content-Type': 'application/sdp',
}, },
body: offer.sdp, body: offer,
}) })
.then((res) => { .then((res) => {
if (res.status !== 201) { if (res.status !== 201) {
@ -456,7 +468,7 @@ const sendOffer = (offer) => {
sessionUrl = new URL(res.headers.get('location'), window.location.href).toString(); sessionUrl = new URL(res.headers.get('location'), window.location.href).toString();
return res.text(); return res.text();
}) })
.then((sdp) => onRemoteAnswer(sdp)) .then((answer) => onRemoteAnswer(answer))
.catch((err) => { .catch((err) => {
onError(err.toString(), true); onError(err.toString(), true);
}); });
@ -467,7 +479,7 @@ const createOffer = () => {
.then((offer) => { .then((offer) => {
offerData = parseOffer(offer.sdp); offerData = parseOffer(offer.sdp);
pc.setLocalDescription(offer); pc.setLocalDescription(offer);
sendOffer(offer); sendOffer(offer.sdp);
}); });
}; };