JavaScriptビデオプレーヤーのHLSストリームでデフォルトのオーディオトラックを選択します

##はじめに

こんにちは streampack チームのメディです。
https://cloudpack.jp/service/option/streampack.html

## Copyrights 
**Elephants Dream**
© copyright Blender Foundation | https://orange.blender.org

![Screen Shot 2020-11-19 at 16.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229807/81e710b5-320e-01af-c0d3-3eb787625060.png)


###目的
HLSビデオでデフォルトのオーディオトラックを設定する方法を学びます。

###ツール
**VideoJS**：オープンソースのJavaScriptビデオプレーヤー。

###説明
####マニフェストについて
複数のオーディオトラックを持つHLSマニフェストの例。

```
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Chinese",FORCED=NO,AUTOSELECT=YES,URI="chinese/ed.ttml",LANGUAGE="zho"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="French",FORCED=NO,AUTOSELECT=YES,URI="french/ed.ttml",LANGUAGE="fra"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="en",NAME="English",DEFAULT=YES,AUTOSELECT=YES,URI="en/chunklist_w370587926_b160000_ao_slen_t64RW5nbGlzaA==.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="sp",NAME="Spanish",DEFAULT=NO,AUTOSELECT=YES,URI="sp/chunklist_w370587926_b160000_ao_slsp_t64U3BhbmlzaA==.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="en",NAME="Commentary (eng)",DEFAULT=NO,AUTOSELECT=NO,URI="com/chunklist_w370587926_b160000_ao_slen_t64Q29tbWVudGFyeSAoZW5nKQ==.m3u8"
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2962000,NAME="High",CODECS="avc1.66.30",RESOLUTION=1280x720,AUDIO="aac",SUBTITLES="subs"
1280/chunklist_w370587926_b2962000_vo_slen_t64TWFpbg==.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1427000,NAME="Medium",CODECS="avc1.66.30",RESOLUTION=768x432,AUDIO="aac",SUBTITLES="subs"
768/chunklist_w370587926_b1427000_vo_slen_t64TWFpbg==.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=688000,NAME="Low",CODECS="avc1.66.30",RESOLUTION=448x252,AUDIO="aac",SUBTITLES="subs"
448/chunklist_w370587926_b688000_vo_slen_t64TWFpbg==.m3u8
```

上記のマニフェストでは、英語がデフォルトのオーディオトラックです。

```
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="en",NAME="English",DEFAULT=YES,AUTOSELECT=YES,URI="en/chunklist_w370587926_b160000_ao_slen_t64RW5nbGlzaA==.m3u8"
```

####ビデオイベントについて
HLSマニフェストが読み込まれた後、オーディオトラックを選択する必要があります。
ブラウザによって、トリガーされるイベントは異なります。
たとえば、ChromeとFireFoxでは***loadedmetadata***をリッスンする必要があり、Safariでは ***canplay***をリッスンする必要があります。

###実装

次の例では、**スペイン語**をデフォルトのオーディオトラックとして設定しています。

マニフェストでは、次のオーディオトラックです。

```
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="sp",NAME="Spanish",DEFAULT=NO,AUTOSELECT=YES,URI="sp/chunklist_w370587926_b160000_ao_slsp_t64U3BhbmlzaA==.m3u8"
```

```html 
<!DOCTYPE html>
<html>

<head>
  <title>Videojs 7.8.3 + multi audio</title>
  <meta charset="utf-8">
  <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/video.js/7.8.3/video-js.min.css" />
  <script src="//cdnjs.cloudflare.com/ajax/libs/video.js/7.8.3/video.min.js"></script>
</head>

<body>
  <video class="video-js vjs-default-skin" id="video-container" controls muted autoplay>
    <source src="//cdn.theoplayer.com/video/elephants-dream/playlist.m3u8" type="application/x-mpegURL">
  </video>
</body>
<script>
  var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
  var options = {
    fluid: true
  };
  var player = videojs("video-container", options);
  if (isSafari) {
    player.one("canplay", function() {
      activateTrack();
    });
  } else {
    player.one("loadedmetadata", function() {
      activateTrack();
    });
  }

  function activateTrack() {
    try {
      var audioTrackList = player.audioTracks()
      for (var i = 0; i < audioTrackList.length; i++) {
        var track = audioTrackList[i];
        if (track.label == "Spanish") {
          track.enabled = true;
        }
      }
    } catch (e) {
      console.log("ERROR: " + e);
    }
  }
</script>

</html>
```

###情報源
https://docs.videojs.com/docs/api/player.html

サンプルビデオは[theoplayer](https://www.theoplayer.com/)からです。