WebRTC: обнаружение приглушенного трека быстрее после прогрева - PullRequest
1 голос
/ 15 марта 2019

Я разогреваю свой трансивер следующим образом:

pc.addTranceiver('video')

Это создает фиктивную дорожку в receiver трансивера.Вскоре на этом треке происходит событие unmute.Затем, ~ 3 секунды спустя, происходит событие mute.

Моя цель - как можно быстрее обнаружить, что дорожка является фиктивной.

ideas

  • отправить сообщение через канал данных, сообщая пиру о том, что трек недействителен.это боль, так как мне придется отправить другое сообщение, когда я позже позвоню replaceTrack

  • написать кадр дорожки на холст и посмотреть, является ли это изображением.Это кажется действительно варварским, но это быстрее, чем 3 секунды.

что-нибудь лучше?Такое чувство, что это должно быть довольно просто.

1 Ответ

1 голос
/ 15 марта 2019

Это ошибка в Chrome (пожалуйста, ★, чтобы они это исправили).

В спецификации сказано, что треки приемника должны начинаться muted и должны оставатьсятаким образом, пока не придут пакеты .Но Chrome запускает событие unmute немедленно, а через несколько секунд следует событие mute из-за неактивности ( еще одна ошибка ):

const config = {sdpSemantics: "unified-plan"};
const pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection();

pc1.addTransceiver("video");
pc2.ontrack = ({track}) => {
  console.log(`track starts out ${track.muted? "muted":"unmuted"}`);
  track.onmute = () => console.log("muted");
  track.onunmute = () => console.log("unmuted");
};

pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);
pc1.onnegotiationneeded = async e => {
  await pc1.setLocalDescription(await pc1.createOffer());
  await pc2.setRemoteDescription(pc1.localDescription);
  await pc2.setLocalDescription(await pc2.createAnswer());
  await pc1.setRemoteDescription(pc2.localDescription);
}

В Chrome вы увидите некорректное поведение:

track starts out muted
unmuted
muted

В Firefox вы увидите правильное поведение:

track starts out muted

Обходной путь Chrome:

Пока Chrome не исправит это, я буду использовать этот обходной путь :

const video = document.createElement("video");
video.srcObject = new MediaStream([track]);
video.onloadedmetadata = () => log("unmuted workaround!");

До тех пор, пока это не сработает, предположим, что дорожка muted.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...