HLS 配信

このドキュメントに書かれている FFmpeg に関する事柄についてはサポート対象外ですのでご注意ください

概要

Sora の RTP 転送 API と FFmpeg を利用することで、HTTP Live Streaming(以下 HLS)で配信することが可能です。

検証したバージョン

FFmpeg のバージョン:3.3.3

配信例

下記の例では、RTP 転送 API の応答で送られてきた SDP を FFmpeg に読み込ませることで、 Sora から送られてきた RTP パケットを受信して H.264/MP3 の TS ファイルで出力しています。

配信時は、この時同時に作成/更新されているプレイリスト(m3u8 ファイル)を TS ファイルと一緒に Web サーバで公開します。

変換例:

#!/bin/bash

CHANNEL_ID=sora
VIDEO_PORT=60001
# VIDEO_PORT + 1 は RTCP の待ち受けで使用されるため空けておく
# また、AUDIO_PORT + 1 も RTCP の待ち受けで使用される
AUDIO_PORT=$(( $VIDEO_PORT + 2 ))

VIDEO_CODEC=libx264
AUDIO_CODEC=libmp3lame
QUEUE_SIZE=4000


start_forwarding_rtp() {
  data=$( jq -n -c --arg channel_id $CHANNEL_ID --argjson video_port $VIDEO_PORT \
                   --argjson audio_port $AUDIO_PORT \
                   '{"channel_id":$channel_id, "ip_address":"127.0.0.1", "video_port":$video_port, "audio_port":$audio_port}' )
  curl -Ssf -X POST \
       -H "x-sora-target:Sora_20170814.StartForwardingRtp" \
       -d $data \
       127.0.0.1:3000
}

json=$( start_forwarding_rtp )
sdp=$( echo $json | jq -r .sdp )

echo "$sdp" | ffmpeg  \
  -loglevel fatal \
  -protocol_whitelist file,rtp,udp,pipe \
  -i pipe:0 \
  -c:v $VIDEO_CODEC \
  -c:a $AUDIO_CODEC \
  -map 0 \
  -flags -global_header \
  -max_muxing_queue_size $QUEUE_SIZE \
  -f hls \
  -hls_segment_type mpegts \
  -hls_flags append_list \
  -hls_list_size 0 \
  -hls_segment_filename index%d.ts \
  index.m3u8

ブラウザにアクセスさせる HTML の video タグにはプレイリストを指定します。

例:

<html>
  <head>
    <title>HLS</title>
  </head>
  <body>
    <div>
      <video src="index.m3u8" controls />
    </div>
  <body>
</html>