Ваш код удаляет все дорожки из MediaStream, не только видео. Чтобы удалить только видео, вы должны сделать
video.srcObject.getVideoTracks().forEach(track => {
track.stop()
video.srcObject.removeTrack(track);
});
Обратите внимание, как getTracks
заменяется на getVideoTracks
.
Но даже в этом случае последний кадр видео-дорожки вполне может остаться в элементе <video>
. Чтобы избавиться от этого, но сохранить звуковые дорожки, вам лучше создать новый MediaStream из звуковых дорожек и установить его как новый srcObject вашего <video>
:
Код этого fiddle , поскольку iframe StackSnippet не может вызывать getUserMedia.
(async ()=>{
const video = document.querySelector('video');
const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true } );
video.srcObject = stream;
video.play();
btn.onclick = e => {
stream.getVideoTracks().forEach( vidTrack => vidTrack.stop() );
const new_stream = new MediaStream(stream.getAudioTracks());
video.srcObject = new_stream;
btn.remove();
}
})();
<button id="btn">keep only audio</button>
<video controls autoplay></video>
И если вы хотите заменить его на цвет solid (например, черную рамку), то вы можете передайте CanvasCaptureStreamTrack вместе со звуковыми дорожками и нарисуйте этот solid цвет на источнике <canvas>
: fiddle