一瞬でライブ配信を実装できるbambuserを試してみた

# bambuserとは
bambuserとは、ライブコマースなどのユースケースを想定したライブ配信ソリューションです。
配信側と視聴側が両方用意されています。
https://bambuser.com/

ドキュメント
https://bambuser.com/docs/

# 機能
## リソースURI
bambuserのキーコンセプトとして、リソースURIがあります。
それぞれの配信をidentifyするもので、以下のようなURLで指定されます。

```
https://cdn.bambuser.net/broadcasts/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
```

配信はデフォルトでプライベートであり、署名キーを使用して署名付きリソースURIを生成し、それを配布することで視聴者が配信を見れるようになります。pre-signed URIも用意されています。

サンプルコード

```javascript
const crypto = require('crypto');
const MY_DA_ID = '';
const MY_DA_SECRET_KEY = '';
let uri = 'https://cdn.bambuser.net/broadcasts/948bca3e-a4af-471d-9f4a-2f51d246a10a';
uri += '?da_id=' + MY_DA_ID;
uri += '&da_timestamp=' + Math.floor(Date.now() / 1000);
uri += '&da_nonce=' + Math.random();
uri += '&da_signature_method=HMAC-SHA256';
const stringToSign = 'GET ' + uri;
const signature = crypto.createHmac('sha256', MY_DA_SECRET_KEY)
  .update(stringToSign)
  .digest('hex');
const signedUri = uri + '&da_signature=' + signature;
```

## 動画配信
iframeを埋め込むだけで、ライブ配信が実現できてしまいます。
また、アプリ側もSDKが用意されていて、React NativeやCordovaなどにも対応しています。
WEBの場合は、以下のようにiframeを埋め込むだけで、配信機能が実装できます。
ブラウザでカメラと音声の許可が必要です。

```html
<iframe 
  src="https://dist.bambuser.net/broadcaster/?application_id=9TNyWjNc6WxhszYykobSGA&ticket=domain%3Dlvh.me&da_signature_header=da_id..." 
  style="border: none; width: 100%; height: 100vh"
  allowfullscreen
  allow="microphone; camera">
</iframe>
```

## RTMP配信
Wirecast / OBS / Switcher Studio / GoPro / ドローンなどからのRTMP配信に対応しています。

## プレイヤー
埋め込みの他、プレイヤーリンクや直接の動画ソースURLを作成することもできます。

```html
<iframe 
  src="https://dist.bambuser.net/player/? 
  resourceUri=https%3A%2F%2Fcdn.bambuser.net%2Fgroups%2F92115%2Fbroadcasts..." 
  style="border: none" 
  allowfullscreen>
</iframe>
```

JavaScriptでコントロールする場合

```javascript

var resourceUri = 'https://cdn.bambuser.net/broadcasts/0b9860dd-359a-67c4-51d9-d87402770319?da_signature_method=HMAC-SHA256&da_id=9e1b1e83-657d-7c83-b8e7-0b782ac9543a&da_timestamp=1482921565&da_static=1&da_ttl=0&da_signature=...';

var player = BambuserPlayer.create(document.getElementById('player'), resourceUri, {
  noFullscreen: true // Do not allow fullscreen
});

// 停止したりした時のイベントリスナー
player.addEventListener('pause', function() {
  console.log('player paused');
});
player.addEventListener('timeupdate', function() {
  console.log('current time', player.currentTime);
});

player.controls = false;
player.currentTime = 300;
player.play();

document.getElementById('player').addEventListener('click', function() {
  return player.paused ? player.play() : player.pause();
});

if (navigator.userAgent.match(/iPad|iPhone|iPod/) && !window.MSStream) {
  player.controls = true;
}
```

# React Native
珍しくReact Nativeに対応しています。

### 配信用
https://github.com/bambuser/react-native-bambuser-broadcaster

### プレイヤー用
https://github.com/bambuser/react-native-bambuser-player

# 遅延
遅延についてはある程度のチューニングを行ったhlsというレベルのため、2~6秒は発生してしまいます。そのため、もちろんですが双方向でコミュニケーションを行うような用途には使えません。
そのかわり、WebRTCなどよりも汎用性が高く、クライアント側のカスタマイズもしやすいかと思います。

# 価格・プラン
2020年5月時点の価格です。
※ 動画時間 = 1ヶ月に生成されたビデオの合計時間。RTMPもカウントされる。
※ 配信容量 = 視聴者に配信される動画の容量の合計。
※ オンデマンド容量 = ストレージへの保管料金。

### Starter
基本料金：　$39（約4,000円）
同時配信数:　3つまで
動画時間： 25h~ は1時間あたり$1.989（約200円）
配信容量： 25GB~ は1GBあたり$0.378（約40円）
オンデマンド容量: 25GB~ は1GBあたり$0.378（約30円）

### Medium
基本料金：　$399（約40,000円）
同時配信数:　無制限
動画時間： 250h~ は1時間あたり$0.246（約26円）
配信容量： 250GB~ は1GBあたり$0.063（約7円）
オンデマンド容量: 250GB~ は1GBあたり$0.081（約9円）

### Large
基本料金：　$1199（約128,000円）
同時配信数:　無制限
動画時間： 1000h~ は1時間あたり$0.246（約12円）
配信容量： 1000GB~ は1GBあたり$0.050（約6円）
オンデマンド容量: 1000GB~ は1GBあたり$0.081（約4円）

注）720pで1時間=約1GBです。

# まとめ
ライブ配信のチューニングはフルスクラッチだと初期コストがかかるため、手っ取り早くライブ配信システムを導入したい場合におすすめです。