1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon IVS触ってみた

Last updated at Posted at 2024-10-28

viviONグループでは、DLsiteやcomipoなど、二次元コンテンツを世の中に届けるためのサービスを運営しています。
ともに働く仲間を募集していますので、興味のある方はこちらまで。

Amazon IVSとは🤔

簡単に言えばAmazonが提供している配信基盤サービス(Amazon Interactive Video Service)です。

  • 特徴
    • Web, iOS, Android対応
    • 低レイテンシー
    • 映像、音声配信可能(OBS配信もOK)
    • Amazon S3 への自動録画機能あり
  • 公式サイト

使ってみる✍️

利用環境

FW:Nuxt3

言語:Typescript

下準備

①まずはAWSの管理画面から配信用のチャネルを作成します

スクリーンショット 2024-10-23 12.15.45.png

②チャネルを作成すると様々な情報が表示されますが、今回配信で必要なデータは「ストリームキー」と「取り込みエンドポイント」になります

f.png

実際にアプリケーションに組み込む際は、こちらの実装をバックエンド側で実装することになるかと思います!

Nuxt側からチャンネルに接続して配信開始

①パッケージのインストール

npm install amazon-ivs-web-broadcast

②とりあえずインポートしておく

import * as IVSBroadcastClient from 'amazon-ivs-web-broadcast';

③インスタンスの作成

const client = IVSBroadcastClient.create({
   streamConfig: IVSBroadcastClient.BASIC_LANDSCAPE, // チャンネル作成時に設定したチャネルタイプに合わせる
   ingestEndpoint: '*****', // ここに取り込みエンドポイントを設定
});

④マイクの権限許可(今回は音声配信で検証のためマイクのみ)

let permissions = {
  audio: false,
  video: false,
};
try {
  const stream = await navigator.mediaDevices.getUserMedia({
    video: false,
    audio: true,
  });
  for (const track of stream.getTracks()) {
    track.stop();
  }
  permissions = { video: false, audio: true };
} catch (error) {
  permissions = { video: false, audio: false };
  console.error(error);
}
if (!permissions.audio) {
  console.error('マイクを使用できませんでした。');
}

⑤マイクの追加(今回は既定のデバイスを使用するように指定しました)

マイクの許可ができた上でこちらの処理が走るようにしましょう
許可できていないとエラーになります😣

const devices = await navigator.mediaDevices.enumerateDevices();
const audioDevices = devices.filter((d) => d.kind === 'audioinput');
if (audioDevices.length) {
  const microphoneStream = await navigator.mediaDevices.getUserMedia({
    audio: {
      deviceId: 'default', // 既定のデバイスを使用
    },
  });
  await this.broadcastClient.addAudioInputDevice(microphoneStream, 'microphone');
  this.isMicActive.value = true;
} else {
  console.error('マイクが見つかりませんでした。');
}

⑥ブロードキャストの開始

管理画面を確認すると状態がライブになっていることが確認できます🤙

client.startBroadcast('*****'); // ここにストリームキーを設定

image (1).png

⑦マイクのミュート

let audioStream = client.getAudioInputDevice('microphone');
audioStream.getAudioTracks()[0].enabled = false;

⑧マイクのミュート解除

ビデオも利用している場合はマイクと同様の方法でVideoInputDeviceでオンオフが切り替えられます🙆‍♂️

let audioStream = client.getAudioInputDevice('microphone');
audioStream.getAudioTracks()[0].enabled = true;

⑨ブロードキャストの終了

const audioStream = client.getAudioInputDevice('microphone');
if (audioStream && audioStream.getAudioTracks()[0].enabled) {
  audioStream.getAudioTracks()[0].enabled = false;
}
client.removeAudioInputDevice('microphone'); // マイクの接続を切る
client.stopBroadcast(); // ブロードキャストの終了

まとめ

  • Amazon IVSを使った配信の実装はドキュメントどおりに実装すればある程度スムーズに実装することが可能な見込みでした!
  • 視聴に関しては視聴用のURLを利用して視聴することができるので、「.m3u8」に対応したプレイヤーを別途実装する必要があります。
    • Player SDKで実装する方法やHLS.jsを使って実装するなど方法は色々あると思います🙆‍♂️

HLS.jsを使うとレイテンシーが高いので、Player SDKでの実装のほうがおすすめです

Appendix

一緒に二次元業界を盛り上げていきませんか?

株式会社viviONでは、フロントエンドエンジニアを募集しています。

また、フロントエンドエンジニアに限らず、バックエンド・SRE・スマホアプリなど様々なエンジニア職を募集していますので、ぜひ採用情報をご覧ください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?