Top Banner
Web
129

リニア放送型動画サービスの Web フロントエンド

Apr 15, 2017

Download

Engineering

Yusuke Goto
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: リニア放送型動画サービスの Web フロントエンド

Web

Page 3: リニア放送型動画サービスの Web フロントエンド
Page 4: リニア放送型動画サービスの Web フロントエンド

!

Page 5: リニア放送型動画サービスの Web フロントエンド
Page 6: リニア放送型動画サービスの Web フロントエンド
Page 7: リニア放送型動画サービスの Web フロントエンド
Page 8: リニア放送型動画サービスの Web フロントエンド
Page 9: リニア放送型動画サービスの Web フロントエンド
Page 10: リニア放送型動画サービスの Web フロントエンド
Page 11: リニア放送型動画サービスの Web フロントエンド
Page 12: リニア放送型動画サービスの Web フロントエンド
Page 13: リニア放送型動画サービスの Web フロントエンド
Page 14: リニア放送型動画サービスの Web フロントエンド
Page 15: リニア放送型動画サービスの Web フロントエンド
Page 16: リニア放送型動画サービスの Web フロントエンド
Page 17: リニア放送型動画サービスの Web フロントエンド
Page 18: リニア放送型動画サービスの Web フロントエンド
Page 19: リニア放送型動画サービスの Web フロントエンド
Page 20: リニア放送型動画サービスの Web フロントエンド
Page 21: リニア放送型動画サービスの Web フロントエンド
Page 22: リニア放送型動画サービスの Web フロントエンド

👤

https://abema.tv/

Schedule

Live

Page 23: リニア放送型動画サービスの Web フロントエンド

https://abema.tv/

Schedule

Live

👤

Page 24: リニア放送型動画サービスの Web フロントエンド

https://abema.tv/

Schedule

Live

👤

Page 25: リニア放送型動画サービスの Web フロントエンド
Page 26: リニア放送型動画サービスの Web フロントエンド
Page 27: リニア放送型動画サービスの Web フロントエンド

HLSMPEG-DASHRTMPMPEG2-TSH.264 AACPlayReadyWidevineFairPlay

Video

ECMAScript 2015 TypeScriptActionScriptCSS4css-modules

Languages

ReactRxJSImmutableJS

Flux Architecture

Atomic DesignInterface InventoryComponent Driven DevelopmentStyleguide InVisionPixate

Design Workflow

DockerKubernetesNGINXNode.js

Infrastructure

Page 28: リニア放送型動画サービスの Web フロントエンド

2016/10/20 - http://abematv.connpass.com/event/42692/

2016/11/11 - http://abematv.connpass.com/event/42695/

Page 31: リニア放送型動画サービスの Web フロントエンド
Page 32: リニア放送型動画サービスの Web フロントエンド
Page 33: リニア放送型動画サービスの Web フロントエンド
Page 34: リニア放送型動画サービスの Web フロントエンド

📄💻

Page 35: リニア放送型動画サービスの Web フロントエンド

📄

💻

📄 📄📄 📄📄 📄📄

Page 36: リニア放送型動画サービスの Web フロントエンド

📄

💻

📄 📄📄 📄📄 📄📄

Page 37: リニア放送型動画サービスの Web フロントエンド

📄

💻

📄 📄📄 📄📄 📄📄

= Live Streaming

Page 38: リニア放送型動画サービスの Web フロントエンド

📄📄📄📄

☁HTTP

💻

Page 39: リニア放送型動画サービスの Web フロントエンド

XHR XHR XHR

Play Play💻

Page 40: リニア放送型動画サービスの Web フロントエンド

💻

Page 41: リニア放送型動画サービスの Web フロントエンド

💻const xhr = new XMLHttpRequest();xhr.open("GET", “1-00.ts", true);…xhr.send(null);

Page 42: リニア放送型動画サービスの Web フロントエンド

💻const xhr = new XMLHttpRequest();xhr.open("GET", “1-01.ts", true);…xhr.send(null);

Page 43: リニア放送型動画サービスの Web フロントエンド
Page 44: リニア放送型動画サービスの Web フロントエンド

HLS

Page 45: リニア放送型動画サービスの Web フロントエンド

HLS 📄📄📄📄

☁HTTP

💻

Page 46: リニア放送型動画サービスの Web フロントエンド

📄 📄 ☁HTTP 💻Playlist Segment

Page 47: リニア放送型動画サービスの Web フロントエンド

📄 📄 ☁HTTP 💻Playlist Segment

m3u8 ts

Page 48: リニア放送型動画サービスの Web フロントエンド
Page 50: リニア放送型動画サービスの Web フロントエンド

📄 📄 ☁HTTP 💻Playlist Segment

mpd mp4

Page 51: リニア放送型動画サービスの Web フロントエンド
Page 53: リニア放送型動画サービスの Web フロントエンド

💻

const xhr = new XMLHttpRequest();xhr.open( "GET", "playlist.m3u8", true );…xhr.send(null);

Page 54: リニア放送型動画サービスの Web フロントエンド

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,segment1.ts#EXTINF:10,segment2.ts#EXTINF:10,segment3.ts#EXTINF:10,segment4.ts#EXTINF:10,segment5.ts 💻

Page 55: リニア放送型動画サービスの Web フロントエンド

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,segment1.ts#EXTINF:10,segment2.ts#EXTINF:10,segment3.ts#EXTINF:10,segment4.ts#EXTINF:10,segment5.ts 💻

Page 56: リニア放送型動画サービスの Web フロントエンド

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,segment1.ts#EXTINF:10,segment2.ts#EXTINF:10,segment3.ts#EXTINF:10,segment4.ts#EXTINF:10,segment5.ts 💻

const xhr = new XMLHttpRequest();xhr.open( "GET", "playlist.m3u8", true );…xhr.send(null);

Page 57: リニア放送型動画サービスの Web フロントエンド

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,segment1.ts#EXTINF:10,segment2.ts#EXTINF:10,segment3.ts#EXTINF:10,segment4.ts#EXTINF:10,segment5.ts 💻

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:2#EXTINF:10,segment2.ts#EXTINF:10,segment3.ts#EXTINF:10,segment4.ts#EXTINF:10,segment5.ts#EXTINF:10,segment6.ts

Page 58: リニア放送型動画サービスの Web フロントエンド

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,segment1.ts#EXTINF:10,segment2.ts#EXTINF:10,segment3.ts#EXTINF:10,segment4.ts#EXTINF:10,segment5.ts 💻

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:2#EXTINF:10,segment2.ts#EXTINF:10,segment3.ts#EXTINF:10,segment4.ts#EXTINF:10,segment5.ts#EXTINF:10,segment6.ts

Page 59: リニア放送型動画サービスの Web フロントエンド
Page 60: リニア放送型動画サービスの Web フロントエンド
Page 61: リニア放送型動画サービスの Web フロントエンド

MSEor

Page 62: リニア放送型動画サービスの Web フロントエンド
Page 63: リニア放送型動画サービスの Web フロントエンド

MSE

Page 64: リニア放送型動画サービスの Web フロントエンド

MSE

Page 65: リニア放送型動画サービスの Web フロントエンド

MSE

Page 66: リニア放送型動画サービスの Web フロントエンド

MSE

Page 67: リニア放送型動画サービスの Web フロントエンド

Flash HTML5

Page 68: リニア放送型動画サービスの Web フロントエンド

Flash HTML5

Page 69: リニア放送型動画サービスの Web フロントエンド

Flash HTML5

Page 70: リニア放送型動画サービスの Web フロントエンド

Flash HTML5

Page 71: リニア放送型動画サービスの Web フロントエンド

Flash HTML5

Page 72: リニア放送型動画サービスの Web フロントエンド

MSE

Page 73: リニア放送型動画サービスの Web フロントエンド

MSE

Page 76: リニア放送型動画サービスの Web フロントエンド

<video> MediaSource SourceBuffer

Page 77: リニア放送型動画サービスの Web フロントエンド

<video id="video"></video>

var sourceBuffer;const video = document.getElementById("video");const mediaSource = new MediaSource();const type = 'video/mp4; codecs="avc1.4d401f, mp4a.40.2"';

mediaSource.addEventListener("sourceopen", () => { sourceBuffer = mediaSource.addSourceBuffer(type);}, false);

video.src = URL.createObjectURL(mediaSource);

Page 78: リニア放送型動画サービスの Web フロントエンド

const xhr = new XMLHttpRequest();xhr.open("GET", "playlist.m3u8", true);…xhr.send(null);

📄

☁HTTP

💻

Playlist

m3u8

Page 79: リニア放送型動画サービスの Web フロントエンド

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,segment1.ts#EXTINF:10,segment2.ts#EXTINF:10,segment3.ts#EXTINF:10,segment4.ts#EXTINF:10,segment5.ts

📄m3u8 📄☁HTTP 💻Segments

📄📄📄📄📄📄📄

const xhr = new XMLHttpRequest();xhr.open("GET", "segment1.ts", true);xhr.responseType = "arraybuffer"; xhr.onload = e => { sourceBuffer .appendBuffer(e.target.response);};xhr.send(null);

Page 80: リニア放送型動画サービスの Web フロントエンド

📄ts 📄ts📄ts 📄ts

Page 81: リニア放送型動画サービスの Web フロントエンド

📄ts 📄ts📄ts 📄ts

Page 82: リニア放送型動画サービスの Web フロントエンド

📄ts 📄ts📄ts 📄ts

Page 83: リニア放送型動画サービスの Web フロントエンド

📄ts 📄ts

Page 84: リニア放送型動画サービスの Web フロントエンド
Page 85: リニア放送型動画サービスの Web フロントエンド
Page 86: リニア放送型動画サービスの Web フロントエンド

📄ts 📄ts

1,493 Mbits 15 Mbits

Page 87: リニア放送型動画サービスの Web フロントエンド

📄ts 📄ts 📄ts 📄ts📄ts 📄ts

Page 88: リニア放送型動画サービスの Web フロントエンド
Page 89: リニア放送型動画サービスの Web フロントエンド

http://blogs.yahoo.co.jp/linear_pcm0153/32280752.html

Page 90: リニア放送型動画サービスの Web フロントエンド

http://blogs.yahoo.co.jp/linear_pcm0153/32280752.html

Page 91: リニア放送型動画サービスの Web フロントエンド

http://blogs.yahoo.co.jp/linear_pcm0153/32280752.html

Page 92: リニア放送型動画サービスの Web フロントエンド
Page 93: リニア放送型動画サービスの Web フロントエンド

https://developer.jwplayer.com/articles/html5-report/

Page 94: リニア放送型動画サービスの Web フロントエンド

https://developer.jwplayer.com/articles/html5-report/

Page 95: リニア放送型動画サービスの Web フロントエンド

AAC or MP3 ?

https://www.winxdvd.com/resource/aac-vs-mp3.htm

Page 96: リニア放送型動画サービスの Web フロントエンド
Page 97: リニア放送型動画サービスの Web フロントエンド

MPEG-2 TS

📄ts

Page 99: リニア放送型動画サービスの Web フロントエンド

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,program1-1.ts#EXTINF:10,ad1.ts#EXTINF:10,program1-2.ts#EXTINF:10,program2-1.ts#EXTINF:10,ad1.ts

Page 100: リニア放送型動画サービスの Web フロントエンド
Page 101: リニア放送型動画サービスの Web フロントエンド
Page 102: リニア放送型動画サービスの Web フロントエンド

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,program1-1.ts#EXTINF:10,ad1.ts#EXTINF:10,program1-2.ts#EXTINF:10,program2-1.ts#EXTINF:10,ad1.ts

Page 103: リニア放送型動画サービスの Web フロントエンド

#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,program1-1.ts#EXTINF:10,ad1.ts#EXTINF:10,program1-2.ts#EXTINF:10,program2-1.ts#EXTINF:10,ad1.ts

📄ts

Page 104: リニア放送型動画サービスの Web フロントエンド

📄#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,program1-1.ts#EXTINF:10,ad1.ts#EXTINF:10,program1-2.ts#EXTINF:10,program2-1.ts#EXTINF:10,ad1.ts

📄ts

Page 105: リニア放送型動画サービスの Web フロントエンド

📄#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,program1-1.ts#EXTINF:10,ad1.ts#EXTINF:10,program1-2.ts#EXTINF:10,program2-1.ts#EXTINF:10,ad1.ts

📄📄ts

Page 106: リニア放送型動画サービスの Web フロントエンド

📄#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,program1-1.ts#EXTINF:10,ad1.ts#EXTINF:10,program1-2.ts#EXTINF:10,program2-1.ts#EXTINF:10,ad1.ts

📄📄📄ts

Page 107: リニア放送型動画サービスの Web フロントエンド

📄#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,program1-1.ts#EXTINF:10,ad1.ts#EXTINF:10,program1-2.ts#EXTINF:10,program2-1.ts#EXTINF:10,ad2.ts

📄📄📄📄ts

Page 108: リニア放送型動画サービスの Web フロントエンド

TS Packet TS Packet TS Packet TS PacketTS Packet

Page 109: リニア放送型動画サービスの Web フロントエンド

Video Packet Audio Packet Video Packet Audio PacketMeta Packet

Page 110: リニア放送型動画サービスの Web フロントエンド

Video Packet Audio Packet Video Packet Audio PacketMeta Packet

// hls.jshls.player.on( Hls.Events.FRAG_PARSING_METADATA, (event, data) => { console.log(data.samples); // as Uint8Array };);

Page 111: リニア放送型動画サービスの Web フロントエンド
Page 112: リニア放送型動画サービスの Web フロントエンド
Page 113: リニア放送型動画サービスの Web フロントエンド
Page 114: リニア放送型動画サービスの Web フロントエンド

https://abema.tv/

Schedule

Live

👤

Page 115: リニア放送型動画サービスの Web フロントエンド

https://abema.tv/

Schedule

Live

👤

Page 116: リニア放送型動画サービスの Web フロントエンド
Page 117: リニア放送型動画サービスの Web フロントエンド
Page 118: リニア放送型動画サービスの Web フロントエンド
Page 119: リニア放送型動画サービスの Web フロントエンド
Page 120: リニア放送型動画サービスの Web フロントエンド

📹

https://abema.tv/

👤

📄📄📄📄

☁HTTP

RTMP

Encoder Media Server

Page 121: リニア放送型動画サービスの Web フロントエンド

RTMPCM signal

📹

https://abema.tv/

👤

📄📄📄📄

☁HTTP

Encoder Media Server

function onChangeNCStatus() { const code: String = e.info.code; if (code === "NetConnection.Connect.Success") { nc.call("insertCM"); // CM }}

var nc = new NetConnection();nc.addEventListener( NetStatusEvent.NET_STATUS, onChangeNCStatus );

Page 122: リニア放送型動画サービスの Web フロントエンド

RTMPCM signal

📹

https://abema.tv/

👤

📄📄📄📄

☁HTTP

Encoder Media Server

CM

Page 123: リニア放送型動画サービスの Web フロントエンド

📹

https://abema.tv/

👤

📄📄📄📄

☁HTTP

CM

RTMP

Encoder Media Server

CM signal

Page 124: リニア放送型動画サービスの Web フロントエンド

📹

https://abema.tv/

👤

📄📄📄📄

☁HTTP

CM

RTMP

Encoder Media Server

CM signal

Page 125: リニア放送型動画サービスの Web フロントエンド

📹

https://abema.tv/

👤

📄 📄📄

☁HTTPRTMP

Encoder Media Server

CM signal

CM start

📄CM

📄

Page 127: リニア放送型動画サービスの Web フロントエンド
Page 128: リニア放送型動画サービスの Web フロントエンド