# APNG Lip Sync Tool 개발기 - v12: 재생 플레이어 UI
## 개요
립싱크 애니메이션과 음성을 동기화하여 재생하는 웹 플레이어를 구현합니다.
## HTML 구조
```html
```
## JavaScript 플레이어
```javascript
let audio = document.getElementById('lipsync-audio');
let image = document.getElementById('lipsync-image');
let timings = [];
function playLipsync() {
audio.play();
startVisemeSync();
}
function startVisemeSync() {
const syncInterval = setInterval(() => {
if (audio.paused || audio.ended) {
clearInterval(syncInterval);
image.src = `/characters/${character}/rest.png`;
return;
}
const currentTime = audio.currentTime * 1000;
const viseme = getVisemeAtTime(timings, currentTime);
image.src = `/characters/${character}/${viseme}.png`;
}, 50); // 20fps 체크
}
function getVisemeAtTime(timings, timeMs) {
for (const t of timings) {
if (t.start_ms <= timeMs && timeMs < t.end_ms) {
return t.viseme;
}
}
return 'rest';
}
```
## 프리로딩
부드러운 재생을 위해 모든 viseme 이미지를 미리 로드:
```javascript
function preloadVisemes(character) {
const visemes = ['rest', 'A', 'E', 'I', 'O', 'U', 'C', 'F', 'L', 'M', 'W'];
visemes.forEach(v => {
const img = new Image();
img.src = `/characters/${character}/${v}.png`;
});
}
```
---
*다음: v13 - 스트리밍 효과 구현*