본문 바로가기
개발언어/Web API

wavesurfer.js의 regions을 이용한 구간 play방법

by 창용이랑 2024. 7. 31.
728x90

1.마우스로 구간을 선택하고 play 하며

2.스페이스바를 클릭시 play/pause 

3.마우스 우클릭으로 구간해제

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Wavesurfer.js 구간 선택 및 재생 예제</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/wavesurfer.js/3.3.2/wavesurfer.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/wavesurfer.js/3.3.2/plugin/wavesurfer.regions.min.js"></script>
    <style>
        #waveform {
            width: 100%;
            height: 128px;
            background-color: #eee;
            position: relative;
        }
        .controls {
            margin-top: 10px;
        }
    </style>
</head>
<body>
    <div id="waveform"></div>
    
    <!--<필요하면 쓰세요>-->
    <div id="play_time"></div>
    <div id="select_time"></div>
    <div id="all_time"></div>
    <!--</필요하면 쓰세요>-->
    
    <div class="controls">
        <button id="play">재생</button>
        <button id="pause">일시정지</button>
        <button id="stop">정지</button>
    </div>

    <script>
        const wavesurfer = WaveSurfer.create({
            container: '#waveform',
            waveColor: 'violet',
            progressColor: 'purple',
            plugins: [
                WaveSurfer.regions.create()
            ]
        });

        wavesurfer.load('aa.wav'); // 오디오 파일 경로

        let isSelecting = false;
        let startX = 0;
        let endX = 0;

        // 전체 시간 표시
        wavesurfer.on('ready', () => {
            const duration = wavesurfer.getDuration();
            document.getElementById('all_time').innerText = `전체 시간: ${duration.toFixed(2)}초`;
        });
        
        // 마우스 클릭 시작
        waveform.addEventListener('mousedown', (e) => {
            if (e.button === 0) { // 왼쪽 버튼 클릭
                isSelecting = true;
                startX = e.offsetX;
                endX = startX; // 초기 끝 위치 설정
            }
        });

        // 마우스 이동
        waveform.addEventListener('mousemove', (e) => {
            if (isSelecting) {
                endX = e.offsetX;
                // 기존 선택 영역 제거
                wavesurfer.clearRegions();
                // 새로운 선택 영역 표시
                wavesurfer.addRegion({
                    start: wavesurfer.getDuration() * (startX / waveform.offsetWidth),
                    end: wavesurfer.getDuration() * (endX / waveform.offsetWidth),
                    color: 'rgba(0, 150, 255, 0.5)'
                });
                
                console.log('mouse move');
            }
        });

        // 마우스 클릭 종료
        waveform.addEventListener('mouseup', () => {
            isSelecting = false;
            // 구간 선택이 완료되면 선택된 구간을 표시
            if (startX !== endX) {
                const startTime = wavesurfer.getDuration() * (startX / waveform.offsetWidth);
                const endTime = wavesurfer.getDuration() * (endX / waveform.offsetWidth);
                console.log(`선택된 구간: ${startTime.toFixed(2)}초 ~ ${endTime.toFixed(2)}초`);
                
                document.getElementById('select_time').innerText = `선택된 구간: ${startTime.toFixed(2)}초 ~ ${endTime.toFixed(2)}초`;
            }else {
                document.getElementById('select_time').innerText = `선택된 구간: 없음`;
            }
        });

        // 마우스가 영역을 벗어났을 때
        waveform.addEventListener('mouseleave', () => {
            if (isSelecting) {
                isSelecting = false;
            }
        });

        // 마우스 오른쪽 버튼 클릭 이벤트 (구간 해제)
        waveform.addEventListener('contextmenu', (e) => {
            e.preventDefault(); // 기본 컨텍스트 메뉴 방지
            wavesurfer.clearRegions(); // 선택된 구간 해제
        });

        // 버튼 클릭 이벤트
        document.getElementById('play').addEventListener('click', () => {
            play_pause();            
        });

        document.getElementById('pause').addEventListener('click', () => {
            wavesurfer.pause();
        });

        document.getElementById('stop').addEventListener('click', () => {
            wavesurfer.stop();
        });
        
        // 진행 중 시간 표시
        wavesurfer.on('audioprocess', function () {            
            const currentTime = wavesurfer.getCurrentTime();
            document.getElementById('play_time').innerText = `진행 중 시간: ${currentTime.toFixed(2)}초`;               
        });

        // 키보드 이벤트 추가
        document.addEventListener('keydown', (e) => {
            if (e.code === 'Space') { // 스페이스바로 재생/일시정지
                e.preventDefault(); // 기본 동작 방지 (스크롤 등)
                
                play_pause();
            }
        });
        
        function play_pause()
        {
            if (wavesurfer.isPlaying()) {
                    wavesurfer.pause();
                } else {
                    
                    // 선택된 구간 확인
                    const regions = wavesurfer.regions.list;
                    
                    // 선택된 구간이 있을 경우
                    if (Object.keys(regions).length > 0) {
                        const region = regions[Object.keys(regions)[0]]; // 첫 번째 선택된 구간
                        wavesurfer.play(region.start, region.end);  // 선택된 구간만 재생
                    } else {
                        // 선택된 구간이 없으면 전체 재생
                        wavesurfer.play(); 
                    }
                }
        }
        
                
        
    </script>
</body>
</html>