仕組み的には、カメラが対応してればHDとかでも撮れる。
別に音だけでもいけるので、ポッドキャストとかにも。(とりあえず雑に回した感じ、45分くらいは問題なく撮れた)
getUserMedia()とかWebRTCでなんかやりたいな?注: フロントエンドの話をしています(˘ω˘ )
getUserMedia()ね?簡単でしょ?
iOS Safari OR other browsers
      ↑      ↑
    WebRTC
      ↓      ↑
Chrome or Firefox -> MediaRecorder
      ↓
    fetch() w/ .webm
      ↓
Node.js -> ffmpeg -> .ts + .m3u8 = HLS
なんちゃってmonorepo風。
3つのエンドポイントがあるだけ。
/api/initialize/:liveId/api/chunks/:liveId.webmを受けて.tsへトランスコードffmpegが頑張ってる/api/finalize/:liveId.m3u8を手動で作る.tsを数えるレベル(画質)をいくつか用意したり、リアルタイムで見れるようにもできそう。今回は雑に単一画質でアーカイブのみ。
こういうマニフェストを手書きするだけ。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.0,
http://localhost:9999/live/1e26162b-2435-41c0-8140-667bf08ff072/1.ts
#EXTINF:4.0,
http://localhost:9999/live/1e26162b-2435-41c0-8140-667bf08ff072/2.ts
...
#EXTINF:4.0,
http://localhost:9999/live/1e26162b-2435-41c0-8140-667bf08ff072/99.ts
#EXT-X-ENDLIST
仕様: https://tools.ietf.org/html/draft-pantos-http-live-streaming-23
.tsファイルならなんでも動くEXTINFを適当にすると、上手く再生されなくなる・・?Safari最高!
.webmをmultipartで受けるところにハマったくらいasync / awaitも標準対応でシュッとしてていい感じなんでもいいけど合宿の度にNodeでサーバー書いてる気がする。
// こういう感じで
ffmpeg()
  .input(inputPath)
  .videoCodec('libx264')
  .audioCodec('libfdk_aac')
  .audioChannels(2)
  .format('mpegts')
  .outputOptions([
    '-mpegts_copyts 1',
  ])
  .output(outputPath)
  .on('error', err => {})
  .on('end', () => {})
  .run();
ただし「Looking for a new maintainer」らしい・・・!
ffprobeでまとめてdurationを取得する処理で出たexecFileしてもダメerrは常にnullなのに出る、拾えない・・NODE_ENV=productionにするとエラーが見えなくなることが判明した結局、処理タイミングを一括処理から逐次処理に変えたら出なくなった・・お手上げ\(^o^)/
こちらも3つの構成要素。
.webmにしてサーバーへJSフレームワークとかは使ってません!
mimeTypeをコンストラクタに渡せる(仕様上)#start(timeSlice)の存在意義が不明.webmが出力される.webmにだけ、ヘッダがついてる.tsに変換もできないどういうユースケースを想定した結果この実装になってるのか・・。
.webmを結合する#start() / #stop()を繰り返す.webmができる動画コンテナ・コーデックに関わると時間を無限に持っていかれる・・。