GIF 이미지를 미디어 스트림으로

소개



안녕하세요! 오늘 저는 캔버스에서 WebRTC로 GIF 이미지를 스트리밍해야 했습니다. 전체 코드를 표시할 수는 없지만 향후 WebRTC 시리즈에 대한 전체 자습서를 수행할 생각입니다.

사용한 라이브러리:
  • 콘바
  • 기플러



  • 콘바란?



    Konva는 고성능 애니메이션, 전환, 노드 중첩, 계층화, 필터링, 캐싱, 데스크톱 및 모바일 애플리케이션용 이벤트 처리 등을 가능하게 하는 HTML5 Canvas Javascript 프레임워크입니다.

    Konva 스테이지란 무엇입니까?



    간단히 말해서 Konva Stage는 레이어를 표시하는 디스플레이로 사용됩니다.

    Konva 레이어란 무엇입니까?



    레이어는 그릴 수 있는 것입니다.


    기플러란?



    GIF 프레임을 캔버스 요소로 렌더링하는 라이브러리입니다.


    기본 HTML 파일 만들기



    HTML은 매우 간단합니다.

    <!DOCTYPE html>
    <html lang="jp">
      <head>
        <title>Canvas</title>
        <meta charset="utf-8"/>
      </head>
    
      <body>
        <button onclick="publish();">Publish</button>
        <div id="container"></div>
    
        <script src="https://unpkg.com/[email protected]/konva.min.js"></script>
        <script src="https://unpkg.com/[email protected]/gifler.min.js"></script>
        <script src="./main.js"></script>
      </body>
    </html>
    


    컨테이너는 div가 GIF 이미지를 표시하는 데 사용됩니다.

    다음은 Javascript 부분입니다.


    GIF 이미지 표시



    먼저 "main.js"라는 파일에 Konva 스테이지와 레이어를 만들었습니다.

    const stage = new Konva.Stage({
      container: 'container',
      width: 640,
      height: 480 
    });
    
    const layer = new Konva.Layer();
    stage.add(layer);
    


    레이어가 생성되면 스테이지에 추가됩니다.

    다음은 캔버스 요소를 만들고 "onDrawFrame"함수를 만드는 것입니다.

    const canvas = document.createElement('canvas');
    
    const onDrawFrame = (ctx, frame) => {
      canvas.width = frame.width;
      canvas.height = frame.height;
      ctx.drawImage(frame.buffer, 0, 0); 
    
      layer.draw();
    };
    


    그런 다음 이미지를 읽고 Konva 레이어에 추가합니다.

    gifler('./200.gif').frames(canvas, onDrawFrame);
    
    const image = new Konva.Image({
      image: canvas
    });
    
    layer.add(image);
    


    GIF 파일의 프레임은 "onDrawFrame"기능을 통해 처리된 다음 캔버스에 그려집니다.


    캔버스에서 MediaStream으로



    게시 버튼을 클릭하면 다음이 발생합니다.

    const publish = async () => {
      try {
        const mediaStream = await navigator.mediaDevices.getUserMedia({ video: false, audio: true });
        const audioTrack = mediaStream.getAudioTracks()[0];
    
        if (!audioTrack) {
          alert('no audio');
    
          return;
        }
    
        const localCanvas = document.getElementsByTagName('canvas')[0];
        const canvasStream = localCanvas.captureStream(30);
        const canvasTrack = canvasStream.getVideoTracks()[0];
    
        if (!canvasTrack) {
          alert('failed to get video track');
    
          return;
        }
    
        console.log('got audio and video tracks');
        mediaStream.addTrack(canvasTrack);
    
        // Add the stream to a PeerConnection etc.    
      } catch (error) {
        console.error(error);
      }
    };
    


    위는 기본적으로 "getUserMedia"를 호출하여 사용자의 마이크만 가져옵니다.
    완료되면 "captureStream"이 30FPS의 인수로 호출되고 캔버스 비디오 트랙이 얻어지고 마지막으로 캔버스 비디오 트랙을 미디어 스트림 객체에 추가합니다.

    완료되면 RTCPeerConnection을 통해 미디어 스트림 개체를 스트리밍할 수 있습니다. 이에 대해서는 가까운 시일 내에 자세히 살펴보겠습니다.

    GIF일 필요가 없는 모든 것을 표시하는 캔버스에서 captureStream 함수를 사용할 수 있습니다.


    결론



    오늘 저는 Konva와 Gifler 라이브러리에 대해 배웠습니다.

    TBH 저는 아마도 Konva를 사용할 필요가 없었고 Gifler로도 똑같이 할 수 있었을 것입니다. 😅
    하지만 좋은 학습 경험이었습니다. 😃


    내가 일하는 것처럼? 다양한 주제에 대해 포스팅하고 있으니 더 보고 싶으시면 좋아요와 팔로우 부탁드립니다.
    또한 저는 커피를 좋아합니다.

    좋은 웹페이지 즐겨찾기