DASHI 서비스를 계속 발전시키는 도중에, 트위치 채팅도 다시볼 수 있었으면 좋겠다고 생각했다.
문제는 채팅이 영상과 맞게 정확한 시간에 올라와야한다는 건데, 그래서 채팅을 WebVTT로 만들었다.
즉 영상 자막이 된다는 건데, 일반적인 영상 자막처럼이 아니라 세로로 스크롤하며 올라오는 채팅포맷이어야 했다.
<video id="video" controls muted>
<track label="pt" kind="captions" srclang="pt" src="/static/test/MIB2-subtitles-pt-BR.vtt" default/>
</video>
var track = video.textTracks[0];
track.oncuechange = function() {
var cue = this.activeCues[0];
if (cue) {
console.log(cue.text);
}
};
영상에 자막을 추가하고, 영상자막이 변경될때마다 console에 로그를 찍는 코드다.
이를 이용해서 Container에 채팅 Element를 하나씩 추가하고 스크롤을 내리는 코드를 작성하면 채팅처럼 보이게 된다.
player.ready(() => {
const textTrack = player.textTracks()[0];
textTrack.addEventListener("cuechange", () => {
const cue = textTrack.activeCues[0];
if (cue) {
const cueText = cue.text;
const chat = JSON.parse(cueText);
const chatDiv = document.createElement("div");
chatDiv.className = "chat";
chatDiv.innerHTML = `<span style="color: ${chat.color}">${chat.display_name}</span>${chat.msg}`;
chatWrapper.appendChild(chatDiv);
chatWrapper.scrollTop = chatWrapper.scrollHeight;
if (chatWrapper.children.length > 100) {
chatWrapper.removeChild(chatWrapper.children[0]);
}
}
});
});
VideoJS를 사용해서 약간 다른점은 있지만 골자는 같다.
.video-js .vjs-text-track-display,
video::cue, video::-webkit-media-text-track-display-backdrop,
video::-webkit-media-text-track-display {
opacity: 0;
}
원래 영상에 있던 자막은 가려주면 끝!
'프로그래밍 > JS, Node.js' 카테고리의 다른 글
[TypeScript] satisfies 연산자 알아보기 (0) | 2023.01.24 |
---|---|
CloudFlare KV로 앱 점검시간 관리하기 (1) | 2023.01.21 |
[typescript] 어두운 색깔인지 확인 (isDarkColor, HEX, RGB, tinycolor) (0) | 2022.08.14 |
[Next.js] styled-components를 Client side 렌더링 이전에 적용시키기 (덜그덕 방지, Typescript) (0) | 2022.08.05 |
[Next.js] next/image 이미지 로딩이 너무 느릴때 (0) | 2022.08.05 |