Я хотел бы получить информацию о конце MediaStreamTrack
. Согласно MDN, событием ended
является
Отправляется, когда заканчивается воспроизведение трека (когда значение
readyState
меняется наended
). Также доступно с использованием свойства обработчика событийonended
.
Поэтому я должен иметь возможность настроить свои обратные вызовы, например:
const [track] = stream.getVideoTracks();
track.addEventListener('ended', () => console.log('track ended'));
track.onended = () => console.log('track onended');
и я ожидаю, что они будут вызваны, как только я остановлю трек через:
tracks.forEach(track => track.stop());
// for good measure? See
// https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/stop#Stopping_a_video_stream
videoElem.srcObject = null;
У меня проблема в том, что обратные вызовы не вызываются. Я создал следующий JSFiddle, где 3 MediaStream создаются тремя разными способами:
getUserMedia
getDisplayMedia
getCaptureStream
(элемент холста)
У меня также есть 3 кнопки, которые останавливают все треки для соответствующего MediaStream
. Поведение выглядит следующим образом:
- Все 3 потока
inactive
, запускается обратный вызов MediaStreamoninactive
(в Chrome кажется например, Firefox не поддерживает это). - Все треки имеют
readyState
изended
после остановки. - Если я останавливаю поток экрана (2. getDisplayMedia) через пользовательский интерфейс Chrome, вызываются обратные вызовы завершения трека.
Я знаю, что вам нужно следить за тем, чтобы трек не использовался несколькими источниками, но здесь этого быть не должно, верно? Я упускаю что-то очевидное?
Поскольку несколько дорожек могут использовать один и тот же источник (например, если две вкладки используют микрофон устройства), сам источник не обязательно сразу останавливается. Вместо этого он отсоединяется от дорожки, и объект дорожки останавливается. Как только ни одна дорожка мультимедиа не использует источник, источник может быть фактически полностью остановлен.