Skip to content

Instantly share code, notes, and snippets.

@gtk2k
Last active April 13, 2019 10:33
Show Gist options
  • Save gtk2k/bcccfdb628daa519de59a30d25cf4491 to your computer and use it in GitHub Desktop.
Save gtk2k/bcccfdb628daa519de59a30d25cf4491 to your computer and use it in GitHub Desktop.
動画配信プロトコル

WebRTCも動画を配信できますが、今回はKDDIのソリューションに対する勉強会ということで、 KDDIが提示した構成図に「Liveshell X」という機材が使われるようです。 この機材は、手のひらサイズの配信機材で、これだけで(PCレス)でライブ配信ができるというもので、さらにバッテリーを搭載しており、 特に屋外やデスクトップ以外での配信に焦点を当てた機材となっています。 「Liveshell X」は

RTMP

RTMPはAdobeがFlashで使うために開発したプロトコルで、RTMPのプロトコルでの一番の特徴がプッシュ配信、 つまり、配信者が自由なタイミングで配信を開始でき、(また、仕様が公開されているので)特に放送主からサーバーにストリームを配信するのに使われており、 Youtube Live, ニコ生, Fresh Live, Twitch, Ustream など主要なライブ配信サービスで放送主からサーバーに配信するプロトコルとして採用されています。 また、Flashが起動できる環境、つまりブラウザー上からでも配信ができるというのが特徴です。(Flashはセキュリティ上の理由によりブラウザーから廃止されて行っている) RTMPはTCPベースのプロトコルです。 ただし、RTMPは基本的に1:1におけるプロトコルですので、生放送を多人数の視聴者側に配信するにはブロードキャスト(同時配信)を行うサーバーが必要となります。

ブロードキャストで使用される主なプロトコル

HLS (HTTP Live Streaming)

HLSはAppleがiOSデバイス向けに配信するために開発したプロトコル。 名前からわかるようにHTTPベースですのでファイアウォールの影響をほぼ受けず配信でき、Webサーバーからも配信できます。もちろん、ライブだけでなくVOD配信もできます。 また、SafariではvideoエレメントでHLS再生がデフォルトでサポートされている。(Edgeでもだいぶ前だがサポートされた) HLSは.m3u8という拡張子のプレイリストファイル(インデックスファイルとも呼ばれる)があり、このファイルにセグメント化された動画ファイル(数秒ごとに分割した動画ファイル)のアドレスのリストおよび制御コマンドが記述されています。ABR(アダプティブビットレート:回線状況に応じて動的にビットレートを変える)配信においては、それぞれのビットレートごとの.m3u8ファイルのアドレスがルートの.m3u8ファイルに記述されます。
.m3u8ファイルの内容例

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:9.97663, 
media-0.ts
#EXTINF:9.97663, 
media-1.ts
#EXTINF:7.10710, 
media-2.ts
#EXT-X-ENDLIST

ABR対応の.m3u8ファイルの内容例

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000
obs_test_low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700000
obs_test_mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1200000
obs_test_high.m3u8

例では.ts(MPEG-2TS)ファイルが使われていますが、HLSの古いバージョンにおいてはTSのみしかセグメントファイルに使用できませんでしたが、現行のバージョンでは.mp4ファイルもフラグメントファイルに使用できるようになりました。 .mp4のフラグメント化した.mp4のことをfMP4(Fragmented MP4)といいます。

MPEG-DASH (Dynamic Adaptive Streaming over HTTP)

Googleが開発した標準化を目指した動画配信用プロトコルで、こちらもHTTPベース。 構成的にはほぼHLSに似ており、.tsファイルやfMP4に対応しています。 HLSの.m3u8ファイルにあたる.mpdファイルがプレイリストファイルとなり、.mpdファイルはXMLフォーマットで記述されます。
.mpdファイル内容例

<?xml version="1.0"?>
<!-- MPD file Generated with GPAC version 0.6.1-rev14-g8eb0297-master  at 2016-10-30T14:47:02.962Z-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500S" type="static" mediaPresentationDuration="PT0H0M21.545S" maxSegmentDuration="PT0H0M10.000S" profiles="urn:mpeg:dash:profile:full:2011">
 <ProgramInformation moreInformationURL="http://gpac.sourceforge.net">
  <Title>output_dash.mpd generated by GPAC</Title>
 </ProgramInformation>

 <Period duration="PT0H0M21.545S">
  <AdaptationSet segmentAlignment="true" maxWidth="320" maxHeight="240" maxFrameRate="30" par="4:3" lang="eng">
   <Representation id="1" mimeType="video/mp4" codecs="avc3.64000d" width="320" height="240" frameRate="30" sar="1:1" startWithSAP="1" bandwidth="437781">
    <BaseURL>output_track1_dashinit.mp4</BaseURL>
    <SegmentList timescale="15360" duration="153600">
     <Initialization range="0-1128"/>
      <SegmentURL mediaRange="1129-556172" indexRange="1129-1172"/>
      <SegmentURL mediaRange="556173-1134265" indexRange="556173-556216"/>
      <SegmentURL mediaRange="1134266-1172888" indexRange="1134266-1134309"/>
    </SegmentList>
   </Representation>
  </AdaptationSet>
  <AdaptationSet segmentAlignment="true" lang="eng">
   <Representation id="2" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="44100" startWithSAP="1" bandwidth="129622">
    <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    <BaseURL>output_track2_dashinit.mp4</BaseURL>
    <SegmentList timescale="44100" duration="441000">
     <Initialization range="0-1060"/>
      <SegmentURL mediaRange="1061-163674" indexRange="1061-1104"/>
      <SegmentURL mediaRange="163675-326023" indexRange="163675-163718"/>
      <SegmentURL mediaRange="326024-349091" indexRange="326024-326067"/>
    </SegmentList>
   </Representation>
  </AdaptationSet>
 </Period>
</MPD>

HLS / MPEG-DASH 両者における長所・短所

両プロトコルもHTTPベースですのでブラウザーさえあれば(※コーデックをサポートしていれば)視聴できるという特徴があります。 また、videoエレメントがネイティブにこれらのプロトコルをサポートしていなくてもMSE(Media Source Extension)APIがサポートされ ているブラウザーであればhls.jsやvideo.jsなどのライブラリを使うことで視聴できます。
両プロトコルの短所としては、セグメントファイルをダウンロードしてバッファした後再生するため、その分遅延が発生してしまうことです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment