SkyWay 샘플을 Vue.js로 작성하는 자습서 vol1

이전 Nuxt.js x SkyWay 화상 채팅 기사의 반향이 조금 있었으므로 Vue.js에서 SkyWay를 만지는 절차를 따라가면서 기사로 해 보겠습니다.

원래 코드는 여기입니다.

우선 로컬 비디오 액세스까지 할 수 있으면 이번은 나는 만족이므로 vol1만으로 일단 정리합니다.

추기: 라고 진행하고 있어 깨달았지만 vol1은 SkyWay 전혀 사용하지 않네요 ()

1. index.html과 app.js 준비



html은 vue.js 로딩과 app.js 로딩을 기술하여 원래 div 요소 (id = "app")를 만듭니다.

index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="app">
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script src="app.js"></script>
</body>
</html>

급급한 것은 이런 느낌.

app.js
const app = new Vue({
    el: '#app',
    data: {

    },
    methods: {

    },
    mounted: async function () {

    }
});
  • 사용할 변수와 상수를 data로 정의
  • 사용할 함수를 메서드로 정의
  • 초기로드시에 실행하고 싶은 처리를 mounted에 기술

  • 이 정도를 기억해 두면 Vue.js 재기록은 곧 갈 수 있습니다.

    장치에 대한 액세스 설명



    app.js의 mounted 내에 추가합니다.

    app.js
    //省略
    
        mounted: async function () {
            //デバイスへのアクセス
            const deviceInfos = await navigator.mediaDevices.enumerateDevices();
            console.log(deviceInfos);
        }
    
    //省略
    

    2. 서버를 시작하고 확인



    로컬 서버를 시작할 수 있으면 괜찮습니다.
    $ python -m SimpleHTTPServer 3000
    

    localhost:3000에 액세스하여 콘솔을 확인하면 연결된 미디어 장치(카메라나 마이크 등)의 정보가 나옵니다.



    3. 사용할 카메라와 오디오 장치 추출



    data 객체에 audio와 video를 저장하기 위한 배열을 준비

    app.js
        data: {
            audios: [],
            videos: []
        }
    

    app.js
        mounted: async function () {
                //デバイスへのアクセス
            const deviceInfos = await navigator.mediaDevices.enumerateDevices();
    
            //1. オーディオデバイスの情報を取得
            deviceInfos
            .filter(deviceInfo => deviceInfo.kind === 'audioinput')
            .map(audio => this.audios.push({text: audio.label || `Microphone ${this.audios.length + 1}`, value: audio.deviceId}));
    
            //2. カメラの情報を取得
            deviceInfos
            .filter(deviceInfo => deviceInfo.kind === 'videoinput')
            .map(video => this.videos.push({text: video.label || `Camera  ${this.videos.length - 1}`, value: video.deviceId}));
    
            console.log(this.audios, this.videos); 
        }
    
  • 1. filter에서 audioinput의 배열 (각 장치) 정보를 추출하고 그것을 this.aduios에 push하여 저장합니다.
  • 2. 카메라에 대해서도 마찬가지

  • 보충: 지금까지의 코드



    이런 식으로 Vue.js 내의 변수로 인식되게 되어 있습니다.

    4. 선택 상자에서 선택



    선택한 장치를 기억하는 변수 selectAudioselectVideo 추가

    app.js
        data: {
            audios: [],
            videos: [],
            selectedAudio: '', //追記
            selectedVideo: '', //追記
        }
    

    methods에 디바이스가 선택될 때마다 호출되는 함수onChange와, 양쪽 모두가 선택되면 발화한다connectLocalCamera를 정의

    app.js
        methods: {
            onChange: function (){
                if(this.selectedAudio != '' && this.selectedVideo != ''){
                    this.connectLocalCamera();
                }
            },
    
            connectLocalCamera: async function (){
                alert('デバイスが選択されました。');
            }
        },
    

    HTML에 선택 상자를 정의.
    여기에서 선택되면, 이전에 data 객체내에서 정의한 selectAudioselectVideo에 반영된다.

    index.html
        <div id="app">
    
            マイク:
            <select v-model="selectedAudio" @change="onChange">
              <option disabled value="">Please select one</option>
              <option v-for="(audio, key, index) in audios" v-bind:key="index" :value="audio.value">
                {{ audio.text }}
              </option>
            </select>
    
            カメラ: 
            <select v-model="selectedVideo" @change="onChange">
              <option disabled value="">Please select one</option>
              <option v-for="(video, key, index) in videos" v-bind:key="index" :value="video.value">
                {{ video.text }}
              </option>
            </select>
        </div>
    

    움직이면 이런 느낌



    여기까지의 app.js를 정리하면이런 느낌입니다.

    5. 카메라 정보를 브라우저에 반영



    index.html <div id="app"></div>에 다음 비디오 태그 추가

    index.html
            <video id="my-video" muted="true" width="500" autoplay playsinline></video>
    

    app.js의 메소드에서 connectLocalCamera를 완전히 바꿉니다.

    app.js
            connectLocalCamera: async function (){
                const constraints = {
                    audio: this.selectedAudio ? { deviceId: { exact: this.selectedAudio } } : false,
                    video: this.selectedVideo ? { deviceId: { exact: this.selectedVideo } } : false
                }
    
                const stream = await navigator.mediaDevices.getUserMedia(constraints);
                document.getElementById('my-video').srcObject = stream;
            }
    

    정말은 여기에서 document.getElementById를 사용하지 않고 하고 싶었습니다만, 잘하지 않고 조사하면 같은 느낌으로 고민하고 있는 사람 다 그랬기 때문에 살짝 닫았습니다.

    Alternative for setting the srcObject using VueJS

    움직이면 이런 느낌입니다.



    여기까지의 코드(index.html와 app.js)는 여기에 정리해 둡니다.

    요약



    역시 Vue.js로 쓰면 처리의 흐름의 전망이 붙기 쉬워지네요.

    이번까지의 코드는, とりあえずWebページでカメラの映像とかとりたい 때에 사용할 수 있을 것 같습니다.

    도움이되면 다행입니다.

    좋은 웹페이지 즐겨찾기