From b0f1e9e812226954269370da1d5b6e4a3ce555de Mon Sep 17 00:00:00 2001 From: Tomohiro Matsuzawa Date: Fri, 6 Jul 2018 00:25:46 +0900 Subject: [PATCH] first JA version commit --- README.md | 1 + japanese/README-ja.md | 928 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 929 insertions(+) create mode 100644 japanese/README-ja.md diff --git a/README.md b/README.md index 31876fb..21d6c24 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ [🇨đŸ‡ŗ](/simplified-chinese/README-cn.md "Simplified Chinese") +[đŸ‡¯đŸ‡ĩ](/japanese/README-ja.md "Japanese") [![license](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg)](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg) diff --git a/japanese/README-ja.md b/japanese/README-ja.md new file mode 100644 index 0000000..d40da90 --- /dev/null +++ b/japanese/README-ja.md @@ -0,0 +1,928 @@ +[![license](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg)](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg) + +# はじめãĢ + +ビデã‚ĒæŠ€čĄ“ãŽã‚„ã•ã—ã„å…Ĩ門書です。ã‚Ŋフトã‚Ļェã‚ĸ開į™ē者īŧã‚¨ãƒŗジニã‚ĸ向けですが、**čĒ°ã§ã‚‚į†č§ŖできるようãĢ**やさしくčĒŦ明したいと思ãŖãĻいぞす。 [ビデã‚ĒæŠ€čĄ“åˆåŋƒč€…ぎためぎミニワãƒŧã‚¯ã‚ˇãƒ§ãƒƒãƒ—](https://docs.google.com/presentation/d/17Z31kEkl_NGJ0M66reqr9_uTG6tI5EDDVXpdPKVuIrs/edit#slide=id.p)からこぎã‚ĸイデã‚Ŗã‚ĸがį”Ÿãžã‚Œãžã—た。. + +できるだけ**į°ĄæŊ”ãĒč¨€č‘‰ã€ãŸãã•ã‚“ãŽčĻ–čĻšįš„čĻį´ ã€åŽŸčŗĒįš„ãĒ例**をäŊŋãŖãĻいくつかぎデジã‚ŋãƒĢビデã‚ĒぎæĻ‚åŋĩをį´šäģ‹ã—、čĒ°ã§ã‚‚こぎįŸĨč­˜ã‚’åž—ã‚‹æŠŸäŧšã‚’提䞛することがį›Žæ¨™ã§ã™ã€‚おうかごč‡Ēį”ąãĢ訂æ­Ŗã‚„ææĄˆã‚’é€ãŖたり、攚善したりしãĻください。 + +いくつかぎ**ハãƒŗã‚ēã‚Ēãƒŗ** ã‚ģã‚¯ã‚ˇãƒ§ãƒŗでは**dockerがイãƒŗ゚トãƒŧãƒĢ**されãĻ、こぎãƒŦポジトãƒĒをクãƒŧロãƒŗされãĻいることがåŋ…čĻãĢãĒりぞす。 + +```bash +git clone https://github.com/leandromoreira/digital_video_introduction.git +cd digital_video_introduction +./setup.sh +``` +> **æŗ¨æ„**: `./s/ffmpeg` や `./s/mediainfo` ã‚ŗマãƒŗドをčĻ‹ã‚‹ã“とがありぞすが、これらぎプログナムぎ **ã‚ŗãƒŗテナ化į‰ˆ** ã‚’åŽŸčĄŒã—ãĻいることを意å‘ŗしぞす。これらはすでãĢ全ãĻぎåŋ…čĻæĄäģļをæē€ãŸã—ãĻいぞす。 + +全ãĻぎ**ハãƒŗã‚ēã‚ĒãƒŗはこぎãƒŦポジトãƒĒをクãƒŧロãƒŗしたフりãƒĢãƒ€ã§åŽŸčĄŒã™ãšãã§ã™**。 **jupyter examples**ãĢついãĻは、`./s/start_jupyter.sh`でã‚ĩãƒŧバãƒŧをčĩˇå‹•ã—ãĻ、URLをã‚ŗピãƒŧしãĻ、ブナã‚Ļã‚ļでそれをäŊŋうåŋ…čĻãŒã‚りぞす。 + +# 変更åąĨæ­´ + +* DRMã‚ˇã‚šãƒ†ãƒ ãŽčŋŊ加 +* 1.0.0į‰ˆãŽãƒĒãƒĒãƒŧã‚š +* į°ĄäŊ“å­—č¨ŗぎčŋŊ加 + +# į›ŽæŦĄ + +- [はじめãĢ](#intro) +- [į›ŽæŦĄ](#index) +- [åŸēæœŦį”¨čĒž](#basic-terminology) + * [ã‚Ģナãƒŧį”ģ像をįŦĻåˇåŒ–ã™ã‚‹åˆĨぎ斚æŗ•](#other-ways-to-encode-a-color-image) + * [ハãƒŗã‚ēã‚Ēãƒŗ: į”ģåƒã¨č‰˛ãŽåŽŸé¨“](#hands-on-play-around-with-image-and-color) + * [DVDぎį”ģéĸã‚ĸ゚ペクト比は4:3](#dvd-is-dar-43) + * [ハãƒŗã‚ēã‚Ēãƒŗ: ビデã‚Ēプロパテã‚ŖをčĒŋずる](#hands-on-check-video-properties) +- [å†—é•ˇæ€§é™¤åŽģ](#redundancy-removal) + * [č‰˛ã€æ˜Žã‚‹ã•ã¨į§ãŸãĄãŽį›Ž](#colors-luminance-and-our-eyes) + + [ã‚ĢナãƒŧãƒĸデãƒĢ](#color-model) + + [YCbCrとRGB間ぎ変換](#converting-between-ycbcr-and-rgb) + + [クロマã‚ĩブã‚ĩãƒŗプãƒĒãƒŗグ](#chroma-subsampling) + + [ハãƒŗã‚ēã‚Ēãƒŗ: YCbCrピトグナムをčĒŋずる](#hands-on-check-ycbcr-histogram) + * [フãƒŦãƒŧムぎį¨ŽéĄž](#frame-types) + + [IフãƒŦãƒŧム (イãƒŗトナ、キãƒŧフãƒŦãƒŧム)](#i-frame-intra-keyframe) + + [PフãƒŦãƒŧム (前斚向äēˆæ¸Ŧ)](#p-frame-predicted) + - [ハãƒŗã‚ēã‚Ēãƒŗ: IフãƒŦãƒŧムが一つだけぎビデã‚Ē](#hands-on-a-video-with-a-single-i-frame) + + [BフãƒŦãƒŧム (ä¸Ąæ–šå‘äēˆæ¸Ŧ)](#b-frame-bi-predictive) + - [ハãƒŗã‚ēã‚Ēãƒŗ: BフãƒŦãƒŧムå…Ĩりぎビデã‚Ēとぎ比čŧƒ](#hands-on-compare-videos-with-b-frame) + + [ぞとめ](#summary) + * [時間įš„å†—é•ˇåēĻ (イãƒŗã‚ŋãƒŧäēˆæ¸Ŧ)](#temporal-redundancy-inter-prediction) + - [ハãƒŗã‚ēã‚Ēãƒŗ: 動きベクトãƒĢをčĻ‹ã‚‹](#hands-on-see-the-motion-vectors) + * [įŠē間įš„å†—é•ˇåēĻ (イãƒŗトナäēˆæ¸Ŧ)](#spatial-redundancy-intra-prediction) + - [ハãƒŗã‚ēã‚Ēãƒŗ: イãƒŗトナäēˆæ¸ŦをčĒŋずる](#hands-on-check-intra-predictions) +- [ビデã‚Ēã‚ŗãƒŧデックぎäģ•įĩ„ãŋ](#how-does-a-video-codec-work) + * [äŊ•īŧŸãĒぜīŧŸãŠã†ã‚„ãŖãĻīŧŸ](#what-why-how) + * [æ­´å˛](#history) + + [AV1ぎčĒ•į”Ÿ](#the-birth-of-av1) + * [一čˆŦįš„ãĒã‚ŗãƒŧデック](#a-generic-codec) + * [゚テップīŧ‘ - į”ģåƒåˆ†å‰˛](#1st-step---picture-partitioning) + + [ハãƒŗã‚ēã‚Ēãƒŗ: åŒēį”ģをčĒŋずる](#hands-on-check-partitions) + * [゚テップīŧ’ - äēˆæ¸Ŧ](#2nd-step---predictions) + * [゚テップīŧ“ - 変換](#3rd-step---transform) + + [ハãƒŗã‚ēã‚Ēãƒŗ: いろいろãĒäŋ‚数を捨ãĻãĻãŋる](#hands-on-throwing-away-different-coefficients) + * [゚テップīŧ” - 量子化](#4th-step---quantization) + + [ハãƒŗã‚ēã‚Ēãƒŗ: 量子化](#hands-on-quantization) + * [゚テップīŧ• - エãƒŗトロピãƒŧįŦĻåˇåŒ–](#5th-step---entropy-coding) + + [VLCįŦĻåˇåŒ–](#vlc-coding) + + [įŽ—襓įŦĻåˇåŒ–](#arithmetic-coding) + + [ハãƒŗã‚ēã‚Ēãƒŗ: CABAC寞CAVLC](#hands-on-cabac-vs-cavlc) + * [゚テップīŧ– - ビット゚トãƒĒãƒŧムフりãƒŧマット](#6th-step---bitstream-format) + + [H.264ビット゚トãƒĒãƒŧム](#h264-bitstream) + + [ハãƒŗã‚ēã‚Ēãƒŗ: H.264ビット゚トãƒĒãƒŧムをčĒŋずる](#hands-on-inspect-the-h264-bitstream) + * [垊įŋ’](#review) + * [H.265はH.264おぎようãĢよりéĢ˜ã„圧į¸ŽįŽ‡ã‚’原įžã—ãĻいるぎか?](#how-does-h265-achieve-a-better-compression-ratio-than-h264) +- [ã‚Ēãƒŗナイãƒŗぎ゚トãƒĒãƒŧミãƒŗグ](#online-streaming) + * [全äŊ“構造](#general-architecture) + * [プログãƒŦãƒƒã‚ˇãƒ–ãƒ€ã‚Ļãƒŗロãƒŧドとã‚ĸダプテã‚Ŗブ゚トãƒĒãƒŧミãƒŗグ](#progressive-download-and-adaptive-streaming) + * [ã‚ŗãƒŗテãƒŗツäŋč­ˇ](#content-protection) +- [jupyterぎäŊŋい斚](#how-to-use-jupyter) +- [ã‚Ģãƒŗãƒ•ã‚ĄãƒŦãƒŗã‚š](#conferences) +- [å‚č€ƒæ–‡įŒŽ](#references) + +# åŸēæœŦį”¨čĒž + +**į”ģ像**は**äēŒæŦĄå…ƒãƒžãƒˆãƒĒク゚**としãĻč€ƒãˆã‚‹ã“ã¨ãŒã§ããžã™ã€‚**色**ã‚’č€ƒæ…Žã™ã‚‹ã¨ã€į”ģ像を**č‰˛ãŽãƒ‡ãƒŧã‚ŋ**ã‚’čĄ¨ã™ãŸã‚ãŽ**もう一つぎæŦĄå…ƒ**を持ãŖた**三æŦĄå…ƒãƒžãƒˆãƒĒク゚**としãĻ捉えることができぞす。 + +ã“ã‚Œã‚‰ãŽč‰˛ã‚’[åŽŸč‰˛ (čĩ¤ã€įˇ‘、青)](https://ja.wikipedia.org/wiki/%E5%8E%9F%E8%89%B2)ã§čĄ¨įžã™ã‚‹ã“とãĢすると、三つぎåšŗéĸを厚įžŠã™ã‚‹ã“とãĢãĒりぞす。一つめが**čĩ¤**、äēŒã¤į›ŽãŒ**įˇ‘**そしãĻīŧ“つį›ŽãŒ**青**č‰˛ã§ã™ã€‚ + +![an image is a 3d matrix RGB](/i/image_3d_matrix_rgb.png "į”ģ像は三æŦĄå…ƒãƒžãƒˆãƒĒク゚です") + +マトãƒĒク゚ぎそれぞれぎčĻį´ ã‚’**ピクã‚ģãƒĢ** (į”ģį´ )とå‘ŧãŗぞす。. 一つぎピクã‚ģãƒĢã¯ããŽč‰˛ãŽ**čŧåēĻ** (通常は数値)ã‚’čĄ¨ã—ãžã™ã€‚äž‹ãˆã°ã€**čĩ¤ãƒ”クã‚ģãƒĢ**はįˇ‘がīŧã€é’がīŧã€čĩ¤ãŒæœ€å¤§ã‚’意å‘ŗしぞす。**ピãƒŗã‚¯č‰˛ãƒ”ã‚¯ã‚ģãƒĢ**はこれら三つぎ値から成りįĢ‹ãŖãĻいぞす。īŧã‹ã‚‰īŧ’īŧ•īŧ•ãŽæ•°å€¤ã§čĄ¨įžã™ã‚‹ã“とãĢより、ピãƒŗクピクã‚ģãƒĢは**čĩ¤=255、įˇ‘=192、青=203**と厚įžŠã•ã‚Œãžã™ã€‚ + +> #### ã‚Ģナãƒŧį”ģ像をįŦĻåˇåŒ–ã™ã‚‹åˆĨぎ斚æŗ• +> į”ģ像をåŊĸæˆã™ã‚‹č‰˛ã‚’čĄ¨įžã™ã‚‹ãŸã‚ãĢは、äģ–ãĢも多くぎãƒĸデãƒĢがäŊŋãˆãžã™ã€‚äž‹ãˆã°ã€č‰˛ã‚’čĄ¨įžã™ã‚‹ãŽãĢRGBãƒĸデãƒĢではīŧ“バイトäŊŋうぎãĢ寞しãĻ、īŧ‘バイトしかäŊŋわãĒいイãƒŗデック゚パãƒŦットをäŊŋうことができぞす。そういãŖたãƒĸデãƒĢã§ã¯ã€č‰˛ã‚’čĄ¨įžã™ã‚‹ãŸã‚ãĢ三æŦĄå…ƒãƒĸデãƒĢをäŊŋわずãĢäēŒæŦĄå…ƒãƒĸデãƒĢをäŊŋį”¨ã§ãã‚‹ã§ãã‚‹ã§ã—ã‚‡ã†ã€‚ãƒĄãƒĸãƒĒをį¯€į´„ã§ããžã™ãŒã€č‰˛ãŽé¸æŠžč‚ĸをį‹­ã‚ã‚‹ã“とãĢãĒりぞす。 +> +> ![NES palette](/i/nes-color-palette.png "ãƒ•ã‚ĄãƒŸã‚ŗãƒŗパãƒŦット") + +䞋えば、下ぎį”ģ像をãŋãĻãã ã•ã„ã€‚æœ€åˆãŽéĄ”ã¯å…¨ãĻãŽč‰˛ã‚’äŊŋãŖãĻいぞす。äģ–ぎ写įœŸã¯čĩ¤ã€įˇ‘、青ぎåšŗéĸです。 (グãƒŦãƒŧトãƒŧãƒŗでį¤ēしãĻいぞす). + +![RGB channels intensity](/i/rgb_channels_intensity.png "RGBčĻį´ ãŽčŧåēĻ") + +**čĩ¤č‰˛**が最įĩ‚įš„ãĒ色ãĢ寞しãĻ**よりč˛ĸįŒŽã—ãĻいる** (äēŒį•Ēį›ŽãŽéĄ”ぎ最も明るい部分)ことが分かりぞす。一斚**青色** ぎč˛ĸįŒŽã¯æœãŽä¸€éƒ¨ã¨**マãƒĒã‚Ēぎį›ŽãĢしかãŋられぞせん**(æœ€åžŒãŽéĄ”) 。**マãƒĒã‚ĒãŽã˛ã’**ãĢ寞しãĻは、**全ãĻぎåšŗéĸがあぞりč˛ĸįŒŽã—ãĻいãĒい**(最も暗い部分)ことが分かりぞす。 + +å„č‰˛ãŽčŧåēĻでは**ãƒ“ãƒƒãƒˆæˇąåēĻ**としãĻįŸĨられる一厚量ぎビットが不可æŦ ã§ã™ã€‚色(åšŗéĸ)ごとãĢ(0からīŧ’īŧ•īŧ•ãŽå€¤ã§čĄ¨įžã™ã‚‹)**8ビット**をäŊŋうとすると、**24 (8 X 3)ビット**ぎ**č‰˛æˇąåēĻ**を持つことãĢãĒり、īŧ’ぎīŧ’īŧ”äš—į¨ŽéĄžãŽč‰˛ã‚’äŊŋえることが推čĢ–できぞす。 + +> [į”ģ像がおぎようãĢ万į‰Šã‚’ビットとしãĻとらえるぎか](http://www.cambridgeincolour.com/tutorials/camera-sensors.htm)をå­Ļãļと **č‰¯ã„**でしょう + +もう一つぎį”ģ像ぎプロパテã‚Ŗは **č§Ŗ像åēĻ**です。č§Ŗ像åēĻã¯é•ˇã•ãŒã‚ãŸã‚ŠãŽãƒ”ã‚¯ã‚ģãƒĢぎ数です。č§Ŗ像åēĻはよく嚅 x éĢ˜ã•ã¨ã—ãĻ襨įžã•ã‚Œãžã™ã€‚äž‹ãˆã°ã€ä¸‹č¨˜ã¯**4×4**ぎį”ģ像です。 + +![image resolution](/i/resolution.png "į”ģ像č§Ŗ像åēĻ") + +> #### ハãƒŗã‚ēã‚Ēãƒŗ: į”ģåƒã¨č‰˛ãŽåŽŸé¨“ +> [jupyter](#how-to-use-jupyter) (python、numpy、matplotlib、そぎäģ–)をäŊŋãŖãĻ、[į”ģåƒã¨č‰˛ãŽåŽŸé¨“](/image_as_3d_array.ipynb)ができぞす。 +> +> [(エッジ検å‡ē, ã‚ˇãƒŖãƒŧプ化, ãŧかしį­‰ãŽ)į”ģ像フã‚ŖãƒĢã‚ŋがおぎようãĢ動くか](/filters_are_easy.ipynb)をå­Ļãļことができぞす。 + +į”ģ像やビデã‚ĒぎäŊœæĨ­ã‚’する時ãĢãŋるもう一つぎプロパテã‚Ŗは **ã‚ĸ゚ペクト比**です。ã‚ĸ゚ペクト比は、į”ģ像やピクã‚ģãƒĢぎ嚅とéĢ˜ã•ãŽæ¯”įŽ‡ã‚’čĄ¨ã—ãžã™ã€‚ + +動į”ģやį”ģ像が**16x9**ã§ã‚ã‚‹ã¨č¨€ã†ã¨ãã¯ã€ãŸã„ãĻい**į”ģéĸã‚ĸ゚ペクト比 (DAR)**ぎことを指しぞす。しかし、個々ぎピクã‚ģãƒĢを様々ãĒåŊĸįŠļãĢすることができ、これを **ピクã‚ģãƒĢã‚ĸ゚ペクト比 (PAR)**といいぞす。 + +![display aspect ratio](/i/DAR.png "į”ģéĸã‚ĸ゚ペクト比") + +![pixel aspect ratio](/i/PAR.png "ピクã‚ģãƒĢã‚ĸ゚ペクト比") + +> #### DVDぎį”ģéĸã‚ĸ゚ペクト比は4:3 +> DVDぎ原際ぎč§Ŗ像åēĻは704x480ですが、10:11ぎピクã‚ģãƒĢã‚ĸ゚ペクト比を持ãŖãĻいるため、4:3ぎã‚ĸ゚ペクト比をäŋãŖãĻいぞす。(704x10/480x11) + +最垌ãĢ、**ビデã‚Ē**を**単äŊæ™‚é–“**内ぎ** *n*フãƒŦãƒŧムぎä¸Ļãŗ**としãĻ厚įžŠã§ãã€ã‚‚う一つぎį‰šæ€§ã¨čĻ‹ã‚‹ã“とができぞす。*n*はフãƒŦãƒŧムãƒŦãƒŧトもしくはį§’間フãƒŦãƒŧム数 (FPS)です。 + +![video](/i/video.png "ビデã‚Ē") + +ビデã‚Ēã‚’čĄ¨ã™ãŸã‚ãĢåŋ…čĻãĒį§’間あたりぎビット数は**ビットãƒŦãƒŧト**です。 + +> ビットãƒŦãƒŧト = åš… x éĢ˜ã• x ãƒ“ãƒƒãƒˆæˇąåēĻ x フãƒŦãƒŧムãƒŦãƒŧト + +䞋えば、圧į¸Žã‚’全くäŊŋわãĒいãĒら、フãƒŦãƒŧムãƒŦãƒŧトがīŧ“īŧã§ã€ãƒ”クã‚ģãƒĢあたりがīŧ’īŧ”ビットで、č§Ŗ像åēĻが480x240ぎビデã‚Ēは、**į§’間あたり82,944,000ビット**もしくは82.944 Mbps (30x480x240x24)がåŋ…čĻã§ã™ã€‚ + +**ビットãƒŦãƒŧト**がãģとんお一厚ãĒら、å›ē厚ビットãƒŦãƒŧト(**CBR**)とå‘ŧばれぞす。ビットãƒŦãƒŧトが変動するãĒら、可変ビットãƒŦãƒŧト (**VBR**)とå‘ŧばれぞす。 + +> こぎグナフはフãƒŦãƒŧムがįœŸãŖéģ’ぎ間はあぞりビットをäŊŋわãĒい、åˆļį´„äģ˜ããŽVBRをį¤ēしãĻいぞす。 +> +> ![constrained vbr](/i/vbr.png "åˆļį´„äģ˜ããŽvbr") + +éģŽæ˜ŽæœŸãĢã€æŠ€čĄ“č€…ãŸãĄãŒ**帯域嚅をåĸ—やさずãĢ**ビデã‚Ēį”ģéĸでčĒč­˜ã§ãã‚‹ãƒ•ãƒŦãƒŧムãƒŦãƒŧトを倍ãĢã™ã‚‹æŠ€čĄ“ã‚’æ€ã„ã¤ããžã—ãŸã€‚ã“ãŽæŠ€čĄ“ã¯**イãƒŗã‚ŋãƒŧãƒŦãƒŧã‚šå‹•į”ģ**としãĻįŸĨられãĻいぞす。åŸēæœŦįš„ãĢは1「フãƒŦãƒŧム」中でį”ģéĸぎ半分を送り、æŦĄãŽã€Œãƒ•ãƒŦãƒŧム」で掋りぎ半分を送りぞす。 + +äģŠæ—Ĩでは **プログãƒŦãƒƒã‚ˇãƒ–ã‚šã‚­ãƒŖãƒŗæŠ€čĄ“**をäŊŋãŖãĻį”ģéĸãĢ描į”ģされぞす。プログãƒŦãƒƒã‚ˇãƒ–ã¯ã€å‹•ãį”ģ像を描į”ģ、äŋå­˜ã€čģĸ送する手æŽĩぎ一つで、各フãƒŦãƒŧムぎ全čĩ°æŸģįˇšã‚’é †į•ĒãĢ描į”ģしぞす。 + +![interlaced vs progressive](/i/interlaced_vs_progressive.png "イãƒŗã‚ŋãƒŧãƒŦãƒŧ゚寞プログãƒŦãƒƒã‚ˇãƒ–") + +これで **į”ģ像**がおぎようãĢデジã‚ŋãƒĢ襨įžã•ã‚Œã‚‹ãŽã‹ãŒåˆ†ã‹ã‚Šãžã—た。**色**がおぎようãĢ配įŊŽã•ã‚Œã€ãƒ“デã‚Ēã‚’čĄ¨ã™ãŽãĢおぎくらいぎ**į§’間あたりぎビット**がåŋ…čĻãĒぎか、それがå›ē厚ãĒぎか(CBR)可変ãĒぎか(VBR)、**č§Ŗ像åēĻ**と**フãƒŦãƒŧムãƒŦãƒŧト**、äģ–ãĢもイãƒŗã‚ŋãƒŧãƒŦãƒŧ゚やピクã‚ģãƒĢã‚ĸ゚ペクト比やそぎäģ–ぎたくさんぎį”¨čĒžã‚’å­Ļãŗぞした。 + +> #### ハãƒŗã‚ēã‚Ēãƒŗ: ビデã‚Ēプロパテã‚ŖをčĒŋずる +> [ffmpegやmediainfoをäŊŋãŖãĻčĒŦ明したプロパテã‚ŖぎãģとんおをčĒŋずる](https://github.com/leandromoreira/introduction_video_technology/blob/master/encoding_pratical_examples.md#inspect-stream)ことができぞす。 + +# å†—é•ˇæ€§é™¤åŽģ + +圧į¸ŽãĒしãĢビデã‚Ēã‚’æ‰ąã†ã“ã¨ã¯ä¸å¯čƒŊであることをå­Ļãŗぞした。č§Ŗ像åēĻが720pで30fpsぎ場合、**1時間ぎビデã‚Ē一つ**ãĢ**278GB*がåŋ…čĻ**です。(PKZIP、Gzip、PNGでäŊŋわれãĻいる)DEFLATE ぎようãĒ**可逆圧į¸Žã‚ĸãƒĢゴãƒĒã‚ēム一つをäŊŋうだけでは**åŋ…čĻãĒ帯域嚅を十分ãĢ削減**できãĒい**ため、ビデã‚Ēを圧į¸Žã™ã‚‹åˆĨぎ斚æŗ•ã‚’čĻ‹ã¤ã‘ã‚‹åŋ…čĻãŒã‚るぎです。 + +> * こぎ数値は1280 x 720 x 24 x 30 x 3600 (嚅、éĢ˜ã•ã€ãƒ”クã‚ģãƒĢあたりぎビット数、フãƒŦãƒŧムãƒŦãƒŧト、į§’単äŊã§ãŽæ™‚é–“)を掛けることでįŽ—å‡ēしぞした + +これを成し遂げるためãĢ、**į§ãŸãĄãŽčĻ–čĻšãŽäģ•įĩ„ãŋを刊į”¨ã™ã‚‹**ことができぞす。į§ãŸãĄã¯č‰˛ã‚ˆã‚Šã‚‚明るさをčĻ‹åˆ†ã‘ることが垗意です。ぞた、ビデã‚ĒãĢは少しぎ変化しかãĒい多くぎį”ģ像がåĢぞれãĻいる**時間įš„įš°ã‚Ščŋ”し**がありぞす。それぞれぎフãƒŦãƒŧムもぞた、多くぎ領域では同じかäŧŧãĻã„ã‚‹č‰˛ãŒäŊŋわれãĻいる**į”ģ像内ぎįš°ã‚Ščŋ”し**がありぞす。 + +## č‰˛ã€æ˜Žã‚‹ã•ã¨į§ãŸãĄãŽį›Ž + +į§ãŸãĄãŽį›Žã¯[č‰˛ã‚ˆã‚Šã‚‚æ˜Žã‚‹ã•ãĢより敏感](http://vanseodesign.com/web-design/color-luminance/)です。こぎį”ģ像をãŋãĻそれをč‡Ē分č‡ĒčēĢでįĸēčĒã§ããžã™ã€‚ + +![luminance vs color](/i/luminance_vs_color.png "明るさ 寞 色") + +åˇĻ側ぎ**æ­Ŗæ–šåŊĸAとæ­Ŗæ–šåŊĸB**ãŽč‰˛ã¯**同じ**であることが分からãĒいとしãĻも大丈å¤Ģです。į§ãŸãĄãŽč„ŗは**č‰˛ã‚ˆã‚Šã‚‚æ˜Žæš—ãĢæŗ¨æ„ã‚’はらう**ことで錯čĻšã‚’čĩˇã“させãĻいるぎです。åŗå´ã§ã¯ã€åŒã˜č‰˛ãŽã‚ŗネクã‚ŋãƒŧがあるため、į§ãŸãĄīŧˆį§ãŸãĄãŽč„ŗīŧ‰ã¯ã€ãã‚Œã‚‰ã¯åŽŸéš›ã¯åŒã˜č‰˛ã§ã‚るということをį°Ąå˜ãĢ気ãĨきぞす。 + +> **Simplistic explanation of how our eyes work** +> +> [įœŧã¯č¤‡é›‘ãĒ器厘](http://www.biologymad.com/nervoussystem/eyenotes.htm)で、たくさんぎパãƒŧツから成りįĢ‹ãŖãĻいぞすが、ä¸ģãĢ錐äŊ“į´°čƒžã¨æĄŋäŊ“į´°čƒžãĢé–ĸåŋƒãŒã‚りぞす。įœŧは [1億2000万ぎæĄŋäŊ“į´°čƒžã¨600万ぎ錐äŊ“į´°čƒžã‚’åĢんでいる](https://en.wikipedia.org/wiki/Photoreceptor_cell)ぎです。 +> +> **もぎすごくį°Ąå˜ãĢする**ため、įœŧぎパãƒŧツぎ抟čƒŊãŽã†ãĄč‰˛ã¨æ˜Žã‚‹ã•ãĢį„Ļį‚šã‚’åŊ“ãĻぞしょう。**[æĄŋäŊ“į´°čƒž](https://en.wikipedia.org/wiki/Rod_cell)はä¸ģãĢ明るさãĢ寞しãĻč˛Ŧäģģを持ãŖãĻいぞす**。一斚**[錐äŊ“į´°čƒž](https://en.wikipedia.org/wiki/Cone_cell)ã¯č‰˛ãĢ寞しãĻč˛Ŧäģģを持ãŖãĻいぞす**。į•°ãĒãŖãŸč‰˛į´ ã‚’持つ3į¨ŽéĄžãŽéŒäŊ“があり、名前は[S錐äŊ“(青)、M錐äŊ“(įˇ‘)、L錐äŊ“(čĩ¤)](https://upload.wikimedia.org/wikipedia/commons/1/1e/Cones_SMJ2_E.svg)です。 +> +> į§ãŸãĄã¯éŒäŊ“į´°čƒž(色)よりも多くぎæĄŋäŊ“į´°čƒž(明るさ)を持ãŖãĻã„ã‚‹ãŸã‚ã€č‰˛ã‚ˆã‚Šã‚‚æ˜Žæš—ã‚’ã‚ˆã‚Šč­˜åˆĨすることができることが推čĢ–できぞす。 +> +> ![eyes composition](/i/eyes.jpg "įœŧぎ構成") + +į§ãŸãĄã¯**čŧåēĻ** (į”ģ像ぎ明るさぎåēĻ合い)ãĢより敏感であることが分かãŖたところで、それを刊į”¨ã—ãĻãŋることができぞす。 + +### ã‚ĢナãƒŧãƒĸデãƒĢ + +**RGBãƒĸデãƒĢ**をäŊŋãŖãĻ[ã‚Ģナãƒŧį”ģ像がおぎようãĢ](#basic-terminology)抟čƒŊするぎか最初ãĢå­Ļãŗぞしたが、äģ–ぎãƒĸデãƒĢも存在しぞす。原は、čŧåēĻ(明るさ)ã¨č‰˛åēĻ(色)をåˆĨãĢするãƒĸデãƒĢが存在しぞす。それは**YCbCr***としãĻįŸĨられãĻいぞす。 + +> * 同じ分é›ĸã‚’čĄŒã†ãƒĸデãƒĢはもãŖと存在しぞす。 + +こぎã‚ĢナãƒŧãƒĸデãƒĢã¯æ˜Žã‚‹ã•ã‚’čĄ¨ã™ãŸã‚ãĢ**Y**をäŊŋい、īŧ’ã¤ãŽč‰˛ãƒãƒŖãƒŗネãƒĢ**Cb** (é’ãŽč‰˛åˇŽ)と**Cr** (čĩ¤ãŽč‰˛åˇŽ)をäŊŋいぞす。[YCbCr](https://en.wikipedia.org/wiki/YCbCr)はRGBからį”Ÿæˆã™ã‚‹ã“とができ、RGBãĢæˆģすこともできぞす。下ぎ写įœŸãŽã‚ˆã†ãĢ、こぎãƒĸデãƒĢをäŊŋãŖãĻフãƒĢã‚Ģナãƒŧぎį”ģ像をäŊœã‚‹ã“とができぞす。 + +![ycbcr example](/i/ycbcr.png "ycbcr例") + +### YCbCrとRGB間ぎ変換 + +中ãĢは **įˇ‘ãĒã—ã§č‰˛**ぎ全ãĻをį”Ÿæˆã§ãã‚‹ã‹ã¨į•°č­°ã‚’å”ąãˆã‚‹æ–šã‚‚ã„ã‚‹ã§ã—ã‚‡ã†ã€‚ + +こぎčŗĒ問ãĢį­”えるためãĢ、RGBからYCbCrへぎ変換を一通りčĒŦ明しぞす。**[ITU-RグãƒĢãƒŧプ*](https://en.wikipedia.org/wiki/ITU-R)**ãĢよãŖãĻ推åĨ¨ã•ã‚Œã‚‹**[BT.601標æē–](https://en.wikipedia.org/wiki/Rec._601)**からぎäŋ‚æ•°ã‚’äŊŋいぞす。最初ぎ゚テップは、**čŧåēĻã‚’č¨ˆįŽ—する**ことです。ITUãĢææĄˆã•ã‚ŒãĻいる厚数をäŊŋい、RGB値をįŊŽãæ›ãˆãžã™ã€‚ + +``` +Y = 0.299R + 0.587G + 0.114B +``` + +čŧåēĻをえるとæŦĄãĢ、**č‰˛ã‚’åˆ†ã‘ã‚‹** (é’ãŽč‰˛åˇŽã¨čĩ¤ãŽč‰˛åˇŽ)ことができぞす。 + +``` +Cb = 0.564(B - Y) +Cr = 0.713(R - Y) +``` + +それを**æˆģす**ことができ、**YCbCrをäŊŋãŖãĻįˇ‘**を垗ることもできぞす。 + +``` +R = Y + 1.402Cr +B = Y + 1.772Cb +G = Y - 0.344Cb - 0.714Cr +``` + +> * グãƒĢãƒŧプと標æē–はデジã‚ŋãƒĢビデã‚Ēではよくあることです。åŊŧらはäŊ•ãŒæ¨™æē–ãĒぎかを厚įžŠã—ぞす。䞋えば[4KとはäŊ•ã‹īŧŸãŠãŽãƒ•ãƒŦãƒŧムãƒŦãƒŧト、č§Ŗ像åēĻ、ã‚ĢナãƒŧãƒĸデãƒĢをäŊŋうずきかīŧŸ](https://en.wikipedia.org/wiki/Rec._2020)ãĒおです。 + +一čˆŦįš„ãĢ**デã‚Ŗ゚プãƒŦイ** (ãƒĸニã‚ŋãƒŧ、テãƒŦビ、゚クãƒĒãƒŧãƒŗį­‰) ã¯č‰˛ã€…ãĒæ–šæŗ•ã§įĩ„įš”化された**RGBãƒĸデãƒĢだけ**を刊į”¨ã—ぞす。下ぎ写įœŸã§ã„ãã¤ã‹æ‹Ąå¤§ã—ãŸã‚‚ãŽį¤ēしãĻいぞす。 + +![pixel geometry](/i/new_pixel_geometry.jpg "į”ģį´ åŊĸįŠļ") + +### クロマã‚ĩブã‚ĩãƒŗプãƒĒãƒŗグ + +į”ģ像はčŧåēĻã¨č‰˛åēĻæˆåˆ†ã§čĄ¨įžã™ã‚‹ã“とができるぎで、äēē間ぎčĻ–čĻšã‚ˇã‚šãƒ†ãƒ ãŒč‰˛åēĻよりもčŧåēĻãĢ敏感であることを刊į”¨ã—ãĻæƒ…å ąã‚’é¸æŠžįš„ãĢ削減することができぞす。**クロマã‚ĩブã‚ĩãƒŗプãƒĒãƒŗグ**は**色åēĻぎč§Ŗ像åēĻをčŧåēĻぎč§Ŗ像åēĻより小さくする**į”ģ像įŦĻåˇåŒ–æŠ€čĄ“ã§ã™ã€‚ + + +![ycbcr subsampling resolutions](/i/ycbcr_subsampling_resolution.png "ycbcrã‚ĩブã‚ĩãƒŗプãƒĒãƒŗグč§Ŗ像åēĻ") + + +色åēĻぎč§Ŗ像åēĻをおぎくらい小さくすずきでしょうかīŧŸč§Ŗ像åēĻとįĩåˆ (`最įĩ‚įš„ãĒ色 = Y + Cb + Cr`)ぎäģ•æ–šã‚’おぎようãĢするかを厚įžŠã—たいくつかぎ斚åŧãŒã™ã§ãĢ存在しãĻいぞす。 + +これらぎ斚åŧã¯ã‚ĩブã‚ĩãƒŗプãƒĒãƒŗã‚°ã‚ˇã‚šãƒ†ãƒ ã¨ã—ãĻįŸĨられ、īŧ“つぎ部分からãĒる比`a:x:y`としãĻ襨įžã•ã‚Œãžã™ã€‚これは `a x 2`ブロックぎčŧåēĻピクã‚ģãƒĢãĢå¯žã™ã‚‹č‰˛åēĻč§Ŗ像åēĻを厚įžŠã—ãĻいぞす。 + + * `a`īŧšæ¨Ē斚向ぎã‚ĩãƒŗプãƒĢぎåŸēæœŦ数。通常はīŧ”。 + * `x`īŧš1ナイãƒŗį›ŽãŽ`a`ãĢįžã‚Œã‚‹č‰˛äŋĄåˇã‚ĩãƒŗプãƒĢぎ数。(`a`ãĢ寞する水åšŗč§Ŗ像åēĻ) + * `y`īŧš1ナイãƒŗį›Žã¨2ナイãƒŗį›Žã§ãŽå¤‰åŒ–æ•° + +> 4:1:0は䞋外で、`4 x 4`ブロックぎčŧåēĻãĢīŧ‘ã¤ãŽč‰˛äŋĄåˇã‚ĩãƒŗプãƒĢだけをåĢんでいぞす。 + +įžäģŖぎã‚ŗãƒŧデックでよくäŊŋわれる斚åŧã¯**4:4:4(ã‚ĩブã‚ĩãƒŗプãƒĒãƒŗグį„Ąã—)**、**4:2:2、4:1:1、4:2:0、4:1:0、3:1:1**です。 + +> **YCbCr 4:2:0įĩåˆ** +> +> これがYCbCr 4:2:0をäŊŋãŖãĻįĩåˆã•ã‚ŒãŸį”ģ像ぎ断į‰‡ã§ã™ã€‚īŧ‘ピクã‚ģãƒĢãĢīŧ‘īŧ’ビットしかäŊŋわãĒいことãĢæŗ¨æ„ã—ãĻください。 +> +> ![YCbCr 4:2:0 merge](/i/ycbcr_420_merge.png "YCbCr 4:2:0įĩåˆ") + +ä¸ģãĒã‚ŋイプぎクロマã‚ĩブã‚ĩãƒŗプãƒĒãƒŗグでįŦĻåˇåŒ–ã•ã‚ŒãŸåŒã˜į”ģ像をčĻ‹ãĻä¸‹ã•ã„ã€‚ä¸€čĄŒį›ŽãŽį”ģ像は最įĩ‚įš„ãĒYCbCrで、äēŒčĄŒį›ŽãŽį”ģåƒã¯č‰˛åēĻč§Ŗ像åēĻをį¤ēしãĻいぞす。原ãĢ小さãĒåŠŖ化でį´ æ™´ã‚‰ã—いįĩæžœã§ã™ã€‚ + +![chroma subsampling examples](/i/chroma_subsampling_examples.jpg "クロマã‚ĩブã‚ĩãƒŗプãƒĒãƒŗã‚°äž‹") + +[č§Ŗ像åēĻが720pで30fpsぎビデã‚Ēを1æ™‚é–“ãƒ•ã‚Ąã‚¤ãƒĢãĢäŋå­˜ã™ã‚‹ãŸã‚ãĢは278GBぎ領域](#redundancy-removal)がåŋ…čĻãĢãĒることを先ãĢ計įŽ—しぞした。**YCbCr 4:2:0**をäŊŋうと、**半分ぎã‚ĩイã‚ē(139 GB)***ãĢすることができぞす。しかしぞだį†æƒŗãĢはį¨‹é ã„です。 + +> * 嚅、éĢ˜ã•ã€ãƒ”クã‚ģãƒĢごとぎビット数、フãƒŦãƒŧムãƒŦãƒŧトを掛けることãĢã‚ˆã‚Šã“ãŽå€¤ã‚’č¨ˆįŽ—しぞした。先ãĢ計įŽ—した時はīŧ’īŧ”ビットåŋ…čĻã§ã—たが、äģŠã¯īŧ‘īŧ’ビットしかåŋ…čĻã‚りぞせん。 + +
+ +> ### ハãƒŗã‚ēã‚Ēãƒŗ: YCbCrピトグナムをčĒŋずる +> [ffmpegでYCbCrピトグナムをčĒŋずる](/encoding_pratical_examples.md#generates-yuv-histogram)ことができぞす。 ã“ãŽã‚ˇãƒŧãƒŗでは青ぎ寄与įŽ‡ãŒã‚ˆã‚ŠéĢ˜ããĒãŖãĻいぞす。 [ピトグナム](https://en.wikipedia.org/wiki/Histogram)でそぎことがį¤ēされぞす。 +> +> ![ycbcr color histogram](/i/yuv_histogram.png "ycbcrã‚Ģナãƒŧピトグナム") + +## フãƒŦãƒŧムぎį¨ŽéĄž + +æŦĄãĢ**時間įš„ãĒå†—é•ˇæ€§**ぎ削減をčŠĻãŋãĻãŋぞしょう。しかし、そぎ前ãĢいくつかぎåŸēæœŦįš„į”¨čĒž ãĢついãĻæŠŧさえãĻおきぞしょう。30 fpsぎ動į”ģãŒã‚ã‚Šã€ä¸‹č¨˜ãŒæœ€åˆãŽ4フãƒŦãƒŧムであるとしぞす。 + +![ball 1](/i/smw_background_ball_1.png "ボãƒŧãƒĢ1") ![ball 2](/i/smw_background_ball_2.png "ボãƒŧãƒĢ2") ![ball 3](/i/smw_background_ball_3.png "ボãƒŧãƒĢ3") +![ball 4](/i/smw_background_ball_4.png "ボãƒŧãƒĢ4") + +**é’ã„čƒŒæ™¯**ぎようãĢフãƒŦãƒŧム間ãĢ**たくさんぎįš°ã‚Ščŋ”し**をčĻ‹ã‚‹ã“ã¨ãŒã§ããžã™ã€‚čƒŒæ™¯ã¯ãƒ•ãƒŦãƒŧム0からフãƒŦãƒŧム3ãžã§å¤‰åŒ–ã—ãžã›ã‚“ã€‚ã“ãŽå•éĄŒãĢ取りįĩ„むためãĢ、これらを3į¨ŽéĄžãŽãƒ•ãƒŦãƒŧムãĢ**æŠŊ蹥įš„ãĢåˆ†éĄžã™ã‚‹**ことができぞす。 + +### IフãƒŦãƒŧム (イãƒŗトナ、キãƒŧフãƒŦãƒŧム) + +IフãƒŦãƒŧム(参į…§ã€ã‚­ãƒŧフãƒŦãƒŧム、イãƒŗトナ)は**č‡ĒåˇąåŽŒįĩįš„ãĒフãƒŦãƒŧム**です。IフãƒŦãƒŧムはäģ–ãĢ䞝存せずãĢ描į”ģすることができ、静æ­ĸį”ģとäŧŧãĻいぞす。最初ぎフãƒŦãƒŧムは晎通はIフãƒŦãƒŧムですが、äģ–ぎį¨ŽéĄžãŽãƒ•ãƒŦãƒŧムぎ間ãĢもčĻå‰‡įš„ãĢIフãƒŦãƒŧムがæŒŋå…ĨされãĻいぞす。 + +![ball 1](/i/smw_background_ball_1.png "ボãƒŧãƒĢ1") + +### PフãƒŦãƒŧム (äēˆæ¸Ŧ) + +įžåœ¨ãŽį”ģ像は、ãģとんお毎回**īŧ‘つ前ぎフãƒŦãƒŧムをäŊŋãŖãĻ描į”ģする**ことができるというäē‹åŽŸã‚’PフãƒŦãƒŧムは刊į”¨ã—ãĻいぞす。䞋えば、2į•Ēį›ŽãŽãƒ•ãƒŦãƒŧムでは、ボãƒŧãƒĢが前ãĢ動いたという変化しかありぞせん。**フãƒŦãƒŧム1を再構į¯‰ã—ãĻ、į›¸é•į‚šã ã‘ã‚’äŊŋい、īŧ‘つ前ぎフãƒŦãƒŧムを参į…§ã™ã‚‹**ことができぞす。 + +![ball 1](/i/smw_background_ball_1.png "ボãƒŧãƒĢ1") <- ![ball 2](/i/smw_background_ball_2_diff.png "ボãƒŧãƒĢ2") + +> #### ハãƒŗã‚ēã‚Ēãƒŗ: IフãƒŦãƒŧムがīŧ‘つだけぎビデã‚Ē +> PフãƒŦãƒŧムはより小さãĒデãƒŧã‚ŋしかäŊŋわãĒいぎで、全äŊ“ã‚’[IフãƒŦãƒŧムはīŧ‘つだけで、äģ–は全ãĻPフãƒŦãƒŧムぎビデã‚Ē](/encoding_pratical_examples.md#1-i-frame-and-the-rest-p-frames)ãĢエãƒŗã‚ŗãƒŧドしたらおうでしょうīŧŸ +> +> こぎビデã‚Ēをエãƒŗã‚ŗãƒŧドした垌、再į”Ÿã—ãĻビデã‚Ēぎ**前斚ãĢã‚ˇãƒŧク**しãĻãã ã•ã„ã€‚ã‚ˇãƒŧク先ãĢį§ģるぎãĢ**時間がかかる**ことãĢ気ãĨくでしょう。これは、描į”ģためãĢ**PフãƒŦãƒŧムが参į…§ãƒ•ãƒŦãƒŧムをåŋ…čĻã¨ã™ã‚‹** (䞋えばIフãƒŦãƒŧム)ためです。 +> +> もうīŧ‘つ手čģŊãĢできるテ゚トとしãĻ、ぞずīŧ‘つぎI-FrameだけをäŊŋãŖãĻビデã‚Ēをエãƒŗã‚ŗãƒŧドしãĻ、æŦĄãĢ[īŧ’į§’間隔でIフãƒŦãƒŧムをæŒŋå…ĨしãĻエãƒŗã‚ŗãƒŧド](/encoding_pratical_examples.md#1-i-frames-per-second-vs-05-i-frames-per-second)しãĻから、**それぞれぎエãƒŗã‚ŗãƒŧドįĩæžœãŽã‚ĩイã‚ēを比čŧƒ**しãĻください。 + +### BフãƒŦãƒŧム (双斚向äēˆæ¸Ŧ) + +過åŽģとæœĒæĨぎフãƒŦãƒŧãƒ ä¸Ąæ–šã‚’å‚į…§ã—たら、さらãĢéĢ˜ã„圧į¸ŽįŽ‡ã‚’垗ることができるぎではãĒいでしょうかīŧŸīŧãã‚ŒãŒBフãƒŦãƒŧムぎåŸēæœŦです。 + +![ball 1](/i/smw_background_ball_1.png "ボãƒŧãƒĢ1") <- ![ball 2](/i/smw_background_ball_2_diff.png "ボãƒŧãƒĢ2") -> ![ball 3](/i/smw_background_ball_3.png "ボãƒŧãƒĢ3") + +> #### ハãƒŗã‚ēã‚Ēãƒŗ: BフãƒŦãƒŧムäģ˜ããŽãƒ“デã‚Ēとぎ比čŧƒ +> īŧ’つぎ斚æŗ•ã§ã‚¨ãƒŗã‚ŗãƒŧドしãĻãŋぞしょう。īŧ‘つはBフãƒŦãƒŧムäģ˜ãã§ã€ã‚‚う一斚は[BフãƒŦãƒŧムãĒし](/encoding_pratical_examples.md#no-b-frames-at-all)でエãƒŗã‚ŗãƒŧドしãĻã€ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ēおよãŗį”ģčŗĒをįĸēčĒã—ãĻください。 + +### ぞとめ + +これらぎį•°ãĒるį¨ŽéĄžãŽãƒ•ãƒŦãƒŧムは**よりéĢ˜ã„圧į¸ŽįŽ‡ã‚’åž—ã‚‹**ためãĢäŊŋわれぞす。æŦĄãŽį¯€ã§ãŠã†ã‚„ãŖãĻã“ã‚ŒãŒčĄŒã‚ã‚Œã‚‹ãŽã‹čĻ‹ãĻいきぞす。しかし、äģŠãŽã¨ã“ろは**IフãƒŦãƒŧムは重く、PフãƒŦãƒŧムはčģŊいが、最もčģŊいぎはBフãƒŦãƒŧム**ã¨č€ƒãˆãĻおいãĻよいでしょう。 + +![frame types example](/i/frame_types.png "フãƒŦãƒŧムぎį¨ŽéĄžãŽäž‹") + +## 時間įš„å†—é•ˇæ€§ (イãƒŗã‚ŋãƒŧäēˆæ¸Ŧ) + +**時間įš„įš°ã‚Ščŋ”し**を削減するためãĢäŊ•ãŒã§ãã‚‹ã‹čĻ‹ãĻいきぞしょう。こぎį¨ŽãŽå†—é•ˇæ€§ã¯**イãƒŗã‚ŋãƒŧäēˆæ¸Ŧ**ã¨ã„ã†æŠ€čĄ“ã§č§Ŗæąēすることができぞす。 + + +**できるだけ少ãĒいビットをäŊŋãŖãĻ**、é€Ŗįļšã—たフãƒŦãƒŧム0とフãƒŦãƒŧム1をエãƒŗã‚ŗãƒŧドしãĻčĻ‹ãžã—ょう。 + +![original frames](/i/original_frames.png "元ぎフãƒŦãƒŧム") + +īŧ‘つできることとしãĻ、åŧ•ãįŽ—がありぞす。単į´”ãĢ**フãƒŦãƒŧム0からフãƒŦãƒŧム1をåŧ•ã**と、**エãƒŗã‚ŗãƒŧド**するåŋ…čĻãŒã‚ã‚‹**åˇŽåˆ†**を垗ることができぞす。 + +![delta frames](/i/difference_frames.png "åˇŽåˆ†ãƒ•ãƒŦãƒŧム") + +しかし、さらãĢ少ãĒいビットしかäŊŋわãĒい**もãŖとよい斚æŗ•**ãŒã‚ã‚‹ã¨č¨€ãŖたらおうでしょうīŧãžãšã€`フãƒŦãƒŧム0`ã‚’ããĄã‚“ã¨åŽšã‚ã‚‰ã‚ŒãŸåŒēį”ģぎ集合であるとしぞす。そしãĻ`フãƒŦãƒŧム0`ぎそれぞれぎブロックを`フãƒŦãƒŧム1`上ãĢマッチさせようとしぞす。.これは **動き推厚**としãĻč€ƒãˆã‚‹ã“ã¨ãŒã§ããžã™ã€‚ + +> ### Wikipedia - ブロック動きčŖœå„Ÿ +> "**ブロック動きčŖœå„Ÿ**はįžåœ¨ãŽãƒ•ãƒŦãƒŧムを重ãĒらãĒいブロックãĢ分けãĻ、動きčŖœå„Ÿãƒ™ã‚¯ãƒˆãƒĢは**ã“ã‚Œã‚‰ãŽãƒ–ãƒ­ãƒƒã‚¯ãŒãŠã“ã‹ã‚‰ãŽã‚‚ãŽã‹ã‚’čĄ¨ã—ãžã™** (前回ぎフãƒŦãƒŧムが重ãĒらãĒいブロックãĢ分けられ、動きčŖœå„Ÿãƒ™ã‚¯ãƒˆãƒĢã¯ã“ã‚Œã‚‰ãŽãƒ–ãƒ­ãƒƒã‚¯ãŒãŠã“ã¸čĄŒãã‹ã‚’čĄ¨ã™ã¨ã„ã†ãŽã¯ã€ã‚ˆãã‚ã‚‹čĒ¤č§Ŗです。)。 元ぎブロックは元ぎフãƒŦãƒŧム内で通常は重ãĒり合いぞす。ビデã‚Ē圧į¸Žã‚ĸãƒĢゴãƒĒã‚ēムぎ中ãĢは、 すでãĢ送äŋĄã•ã‚ŒãŸį•°ãĒãŖたいくつかぎフãƒŦãƒŧムぎ断į‰‡ã‹ã‚‰įžåœ¨ãŽãƒ•ãƒŦãƒŧムをįĩ„ãŋįĢ‹ãĻるもぎもありぞす。" + +![delta frames](/i/original_frames_motion_estimation.png "フãƒŦãƒŧãƒ åˇŽåˆ†") + +ボãƒŧãƒĢが`x=0、y=25`から`x=6、y=26`へį§ģ動したと推厚することができぞす。**x**と**y**ぎ値は**動きベクトãƒĢ**です。ビットをį¯€į´„するためぎもうīŧ‘つぎ**さらãĒる゚テップ**は、前回ぎブロックäŊįŊŽã¨äēˆæ¸ŦされるブロックäŊįŊŽã¨ãŽ**動きベクトãƒĢãŽåˇŽåˆ†ã ã‘ã‚’ã‚¨ãƒŗã‚ŗãƒŧドする**ことです。 最įĩ‚įš„ãĒ動きベクトãƒĢは`x=6 (6-0)、y=1 (26-25)`ぎようãĢãĒりぞす。 + +> įžåŽŸä¸–į•ŒãŽįŠļæŗã§ã¯ã€ã“ぎ**ボãƒŧãƒĢぱナイ゚されãĻn個ぎåŒēį”ģãĢå…Ĩるでしょう**。しかしå‡Ļį†ã¯åŒã˜ã§ã™ + +フãƒŦãƒŧムįŠļぎį‰ŠäŊ“は**3D斚向ãĢ動き**、ボãƒŧãƒĢã¯čƒŒæ™¯ãŽæ–šãĢ動くと小さくもãĒりぞす。 ブロックへぎ**厌全ãĒマッチをčĻ‹ã¤ã‘られãĒい**ぎは晎通ぎことです。 推厚į”ģ像と原際ぎį”ģåƒã‚’é‡ã­ã‚‹ã¨ä¸‹č¨˜ãŽã‚ˆã†ãĢãĒりぞす。 + +![motion estimation](/i/motion_estimation.png "動き推厚") + +しかし、**動き推厚**を遊į”¨ã™ã‚‹ã¨ã€å˜į´”ãĒフãƒŦãƒŧãƒ åˇŽåˆ†æ‰‹æŗ•ã‚’äŊŋうよりも**エãƒŗã‚ŗãƒŧドするデãƒŧã‚ŋがより小さくãĒる**ことが分かりぞす。 + +![motion estimation vs delta ](/i/comparison_delta_vs_motion_estimation.png "動き推厚 åˇŽåˆ†") + +> ### 可čĻ–化された原際ぎ動きčŖœå„Ÿ +> こぎ手æŗ•ã¯å…¨ãĻぎブロックãĢ遊į”¨ã•ã‚Œã€ã‹ãĒりé ģįšãĢボãƒŧãƒĢはīŧ‘つäģĨ上ぎブロックãĢ配įŊŽã•ã‚Œãžã™ã€‚ +> ![real world motion compensation](/i/real_world_motion_compensation.png "įžåŽŸä¸–į•ŒãŽå‹•ãčŖœå„Ÿ") +> Source: https://web.stanford.edu/class/ee398a/handouts/lectures/EE398a_MotionEstimation_2012.pdf + +[jupyterをäŊŋãŖãĻこれらぎæĻ‚åŋĩを原験](/frame_difference_vs_motion_estimation_plus_residual.ipynb)できぞす。 + +> #### ハãƒŗã‚ēã‚Ēãƒŗ: 動きベクトãƒĢをčĻ‹ã‚‹ +> [ffmpegでイãƒŗã‚ŋãƒŧäēˆæ¸Ŧ (動きベクトãƒĢ)äģ˜ããŽãƒ“デã‚Ēをį”Ÿæˆã™ã‚‹](/encoding_pratical_examples.md#generate-debug-video)ことができぞす。 +> +> ![inter prediction (motion vectors) with ffmpeg](/i/motion_vectors_ffmpeg.png "ffmpegでイãƒŗã‚ŋãƒŧäēˆæ¸Ŧ (動きベクトãƒĢ)") +> +> ぞたは、[Intel Video Pro Analyzer](https://software.intel.com/en-us/intel-video-pro-analyzer) (有料ですが、最初ぎ10フãƒŦãƒŧムãĢåˆļ限されたį„Ąæ–™ãŠčŠĻしį‰ˆã‚‚ありぞす)をäŊŋうこともできぞす。 +> +> ![inter prediction intel video pro analyzer](/i/inter_prediction_intel_video_pro_analyzer.png "イãƒŗã‚ŋãƒŧäēˆæ¸Ŧ intel video pro analyzer") + +## įŠē間įš„å†—é•ˇæ€§ (イãƒŗトナäēˆæ¸Ŧ) + +ビデã‚Ēぎ中ぎ**īŧ‘つīŧ‘つぎフãƒŦãƒŧム**を分析すると、**たくさんぎį›¸é–ĸ性ぎある領域**が存在することが分かりぞす。 + +![](/i/repetitions_in_space.png) + +䞋を通しãĻãŋãĻã„ããžã—ã‚‡ã†ã€‚ã“ãŽã‚ˇãƒŧãƒŗはãģとんお青とį™Ŋで構成されãĻいぞす。 + +![](/i/smw_bg.png) + +これは `IフãƒŦãƒŧム`で、äēˆæ¸ŦぎためãĢ**前ぎフãƒŦãƒŧムをäŊŋえぞせん**が、圧į¸Žã™ã‚‹ã“とはできぞす。čĩ¤ã„ブロックを選択しãĻエãƒŗã‚ŗãƒŧドしãĻãŋぞしょう。**éšŖæŽĨする部分をčĻ‹ã‚‹**と、**ããŽå‘¨ã‚ŠãŽč‰˛ãĢ傞向**があることを**推厚**することができぞす。 + +![](/i/smw_bg_block.png) + +こぎフãƒŦãƒŧムでは**č‰˛ãŒåž‚į›´æ–šå‘ãĢåēƒãŒã‚Š**įļšã‘ることを**äēˆæ¸Ŧ**しãĻãŋぞす。**æœĒįŸĨぎピクã‚ģãƒĢãŽč‰˛ãŒéšŖãŽč‰˛ã‚’æŒã¤**ことを意å‘ŗしぞす。 + +![](/i/smw_bg_prediction.png) + +**äēˆæ¸Ŧが間違うかもしれぞせん**。そぎため、こぎ手æŗ•(**イãƒŗトナäēˆæ¸Ŧ**)を遊į”¨ã—ãĻから、**原際ぎ値をåŧ•ã„ãĻ**åˇŽåˆ†ã‚’į”Ÿæˆã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚ããŽåˇŽåˆ†ã¯å…ƒã‚ˆã‚Šã‚‚ã‚‚ãŖと圧į¸Žã—やすいマトãƒĒク゚ãĢãĒりぞす。 + +![](/i/smw_residual.png) + +> #### ハãƒŗã‚ēã‚Ēãƒŗ: イãƒŗトナäēˆæ¸ŦをčĒŋずる +> [generate a video with macro blocks and their predictions with ffmpegでマクロブロックとそれらぎäēˆæ¸Ŧäģ˜ããŽãƒ“デã‚Ēをį”Ÿæˆã™ã‚‹](/encoding_pratical_examples.md#generate-debug-video)ことができぞす。 documentation to understand the [ãã‚Œãžã‚ŒãŽãƒ–ãƒ­ãƒƒã‚¯ãŽč‰˛ãŽæ„å‘ŗ](https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors)をį†č§ŖするためãĢffmpegぎドキãƒĨãƒĄãƒŗトをčĒŋずãĻください。 +> +> ![intra prediction (macro blocks) with ffmpeg](/i/macro_blocks_ffmpeg.png "ffmpegでイãƒŗã‚ŋãƒŧäēˆæ¸Ŧ (動きベクトãƒĢ)") +> +> ぞたは[Intel Video Pro Analyzer](https://software.intel.com/en-us/intel-video-pro-analyzer) (有料ですが、最初ぎ10フãƒŦãƒŧムãĢåˆļ限されたį„Ąæ–™ãŠčŠĻしį‰ˆã‚‚ありぞす)をäŊŋうことができぞす。 +> +> ![intra prediction intel video pro analyzer](/i/intra_prediction_intel_video_pro_analyzer.png "イãƒŗトナäēˆæ¸Ŧ intel video pro analyzer") + +# ビデã‚Ēã‚ŗãƒŧデックぎäģ•įĩ„ãŋ + +## äŊ•ã‹? ãĒぜ? おぎようãĢ? + +**äŊ•ã‹?** デジã‚ŋãƒĢビデã‚Ēを圧į¸Žã€č§Ŗ凍するã‚Ŋフトã‚Ļェã‚ĸ / ハãƒŧドã‚Ļェã‚ĸぎ部品。**ãĒぜ?** 市場とį¤žäŧšã§ã€åˆļ限された帯域と゚トãƒŦãƒŧジぎ下でよりéĢ˜ã„品čŗĒぎビデã‚ĒへぎčĻæą‚がéĢ˜ãžãŖãĻいるため。30フãƒŦãƒŧム毎į§’、24ビット毎ピクã‚ģãƒĢ、č§Ŗ像åēĻが480x240ぎビデã‚ĒãĢ[åŋ…čĻãŒå¸¯åŸŸã‚’č¨ˆįŽ—](#basic-terminology)したぎをčĻšãˆãĻいぞすか。圧į¸ŽãĒしでは**82.944 Mbps**でした。テãƒŦビやイãƒŗã‚ŋãƒŧネットでHD/FullHD/4Kを配äŋĄã™ã‚‹ãŸã‚ãĢは圧į¸Žã™ã‚‹ã—かありぞせん。**おぎようãĢ?** ここでä¸ģãĒ技æŗ•ãĢついãĻį°Ąå˜ãĢčĻ‹ãĻいきぞす。 + +> **CODEC 寞 ã‚ŗãƒŗテナ** +> +> 初åŋƒč€…がよくやる間違いぎīŧ‘つãĢ、デジã‚ŋãƒĢビデã‚ĒCODECと[デジã‚ŋãƒĢビデã‚Ēã‚ŗãƒŗテナ](https://en.wikipedia.org/wiki/Digital_container_format)ã‚’æˇˇåŒã™ã‚‹ã¨ã„ã†ã‚‚ãŽãŒã‚ã‚Šãžã™ã€‚**ã‚ŗãƒŗテナ**はビデã‚Ē(とéŸŗåŖ°ã‚‚ありえる)ãŽãƒĄã‚ŋデãƒŧã‚ŋとペイロãƒŧドである**圧į¸Žã•ã‚ŒãŸãƒ“デã‚Ē**をåĢむナッパãƒŧフりãƒŧマットとしãĻč€ƒãˆã‚‹ã“ã¨ãŒã§ããžã™ã€‚ +> +> たいãĻい、ビデã‚Ēãƒ•ã‚Ąã‚¤ãƒĢãŽæ‹Ąåŧĩ子はそぎビデã‚Ēã‚ŗãƒŗテナを厚įžŠã—ãžã™ã€‚äž‹ãˆã°ã€ãƒ•ã‚Ąã‚¤ãƒĢ`video.mp4`はおそらく**[MPEG-4 Part 14](https://en.wikipedia.org/wiki/MPEG-4_Part_14)**ã‚ŗãƒŗテナで、`video.mkv`ã¨ã„ã†åå‰ãŽãƒ•ã‚Ąã‚¤ãƒĢはおそらく**[matroska](https://en.wikipedia.org/wiki/Matroska)**です。ã‚ŗãƒŧデックとã‚ŗãƒŗテナフりãƒŧマットをįĸē原ãĢčĒŋずるためãĢは、[ffmpegかmediainfo](/encoding_pratical_examples.md#inspect-stream)をäŊŋうことができぞす。 + +## æ­´å˛ + +一čˆŦįš„ãĒã‚ŗãƒŧデックぎ内部動äŊœãĢå…ĨãŖãĻčĄŒãå‰ãĢ、いくつかぎ古いビデã‚Ēã‚ŗãƒŧデックãĢついãĻ少しį†č§ŖするためãĢ過åŽģを振りčŋ”ãŖãĻčĻ‹ãžã—ょう。 + +ビデã‚Ēã‚ŗãƒŧデックである[H.261](https://en.wikipedia.org/wiki/H.261)は1990åš´(åŽŗ密ãĢは1988åš´)ãĢį”Ÿãžã‚Œãžã—た。H.261は**64 kbit/sぎデãƒŧã‚ŋãƒŦãƒŧト**で動äŊœã™ã‚‹ã‚ˆã†ãĢč¨­č¨ˆã•ã‚Œãžã—ãŸã€‚ã‚¯ãƒ­ãƒžã‚ĩブã‚ĩãƒŗプãƒĒãƒŗグやマクロブロックãĒãŠãŽč€ƒãˆã‚’ã™ã§ãĢäŊŋãŖãĻいぞした。1995åš´ãĢ、**H.263**ビデã‚Ēã‚ŗãƒŧデック標æē–がį™ēčĄ¨ã•ã‚Œ2001åš´ãžã§æ‹Ąåŧĩされįļšã‘ぞした。 + +2003åš´ãĢ**H.264/AVC**ぎ初į‰ˆãŒåŽŒæˆã—ぞした。同じ嚴ãĢ**TrueMotion**とå‘ŧばれるäŧšį¤žãŒã€**ロイヤãƒĒテã‚ŖãƒŧフãƒĒãƒŧ**で非可逆ビデã‚Ē圧į¸ŽãŽ **VP3**とå‘ŧばれるビデã‚Ēã‚ŗãƒŧデックをãƒĒãƒĒãƒŧ゚しぞした。2008åš´ãĢこぎäŧšį¤žã‚’**GoogleãŒč˛ˇã„**、同じ嚴ãĢ**VP8**をãƒĒãƒĒãƒŧ゚しぞした。2012嚴ぎ12月ãĢGoogleが**VP9**をãƒĒãƒĒãƒŧ゚しぞした。VP9は(ãƒĸバイãƒĢをåĢむ)**ブナã‚Ļã‚ļ市場ぎおよそžãĢã‚ĩポãƒŧトされãĻいぞす**。 + + **[AV1](https://en.wikipedia.org/wiki/AOMedia_Video_1)**は新しい**ロイヤãƒĒテã‚ŖãƒŧフãƒĒãƒŧ**でã‚Ēãƒŧプãƒŗã‚Ŋãƒŧ゚ぎビデã‚Ēã‚ŗãƒŧデックで、[Alliance for Open Media (AOMedia)](http://aomedia.org/)ãĢよãŖãĻč¨­č¨ˆã•ã‚Œãžã—ãŸã€‚AOMediaは**č¤‡æ•°ãŽäŧšį¤ž: Google、Mozilla、Microsoft、Amazon、Netflix、AMD、ARM、NVidia、Intel、Cisco**とäģ–ぎいくつかぎäŧšį¤žã‹ã‚‰æˆãŖãĻいぞす。ãƒĒãƒ•ã‚ĄãƒŦãƒŗã‚šã‚ŗãƒŧデックぎ**初į‰ˆ** 0.1.0が**2016åš´4月7æ—ĨãĢå…Ŧ開されぞした**。 + +![codec history timeline](/i/codec_history_timeline.png "ã‚ŗãƒŧãƒ‡ãƒƒã‚¯æ­´å˛åš´čĄ¨") + +> #### AV1ぎčĒ•į”Ÿ +> +> 2015嚴ぎ初期ãĢGoogleが[VP10](https://en.wikipedia.org/wiki/VP9#Successor:_from_VP10_to_AV1)ぎ開į™ē、Xiph (Mozilla)は[Daala](https://xiph.org/daala/)ぎ開į™ē、Ciscoはã‚Ēãƒŧプãƒŗã‚Ŋãƒŧ゚でロイヤãƒĒテã‚ŖãƒŧフãƒĒãƒŧぎ[Thor](https://tools.ietf.org/html/draft-fuldseth-netvc-thor-03)とå‘ŧばれるビデã‚Ēã‚ŗãƒŧデックぎ開į™ēãĢ取りįĩ„んでいぞした。 +> +> MPEG LAは、åŊ“初はHEVC (H.265)ぎ嚴間ロイヤãƒĒテã‚Ŗãƒŧぎ上限とH.264ぎ8倍éĢ˜ã„ナイã‚ģãƒŗ゚料をį™ēčĄ¨ã—ãžã—ãŸãŒã€ã™ããĢãƒĢãƒŧãƒĢを変更しぞした。: +> * **嚴間ロイヤãƒĒテã‚Ŗãƒŧぎ上限ãĒし** +> * **ã‚ŗãƒŗテãƒŗト料金** (収å…Ĩぎ0.5%) +> * **h264より10倍éĢ˜ã„単äŊã‚たり料金**. +> +> [alliance for open media](http://aomedia.org/about-us/)はハãƒŧドã‚Ļェã‚ĸãƒĄãƒŧã‚Ģãƒŧ(Intel、AMD、ARM、Nvidia、Cisco)、ã‚ŗãƒŗテãƒŗツ配äŋĄ (Google、Netflix、Amazon)、ブナã‚Ļã‚ļ開į™ē(Google, Mozilla)、そぎäģ–ぎäŧšį¤žãĢよãŖãĻäŊœã‚‰ã‚Œãžã—た。 +> +> これらぎäŧšį¤žãĢはロイヤãƒĒテã‚ŖãƒŧフãƒĒãƒŧぎビデã‚Ēã‚ŗãƒŧãƒ‡ãƒƒã‚¯ã¨ã„ã†å…ąé€šãŽį›Žįš„があり、AV1はもãŖと [単į´”ãĒį‰šč¨ąãƒŠã‚¤ã‚ģãƒŗã‚š](http://aomedia.org/license/patent/)でčĒ•į”Ÿã—ぞした。**Timothy B. Terriberry**が [AV1ぎæĻ‚åŋĩ、ナイã‚ģãƒŗã‚šãƒĸデãƒĢ、įžįŠļ](https://www.youtube.com/watch?v=lzPaldsmJbk)ãĢついãĻぎį´ æ™´ã‚‰ã—いプãƒŦã‚ŧãƒŗテãƒŧã‚ˇãƒ§ãƒŗã‚’čĄŒã„ãžã—ãŸã€‚ã“ãŽį¯€ã¯ã“ぎプãƒŦã‚ŧãƒŗテãƒŧã‚ˇãƒ§ãƒŗを元ãĢ書いãĻいぞす。 +> +> **ブナã‚Ļã‚ļãƒŧをäŊŋãŖãĻAV1ã‚ŗãƒŧデックを分析**できることをįŸĨãŖãĻ銚くことでしょう。http://aomanalyzer.org/ をčĻ‹ãĻください。 +> +> ![av1 browser analyzer](/i/av1_browser_analyzer.png "av1ブナã‚Ļã‚ļãƒŧã‚ĸナナイã‚ļãƒŧ") +> +> čŋŊ記: ã‚ŗãƒŧãƒ‡ãƒƒã‚¯ãŽæ­´å˛ãĢついãĻもãŖとå­ĻãŗたいãĒã‚‰ã€čƒŒåžŒãĢある[ビデã‚Ē圧į¸ŽãŽį‰šč¨ą](https://www.vcodex.com/video-compression-patents/)ぎåŸēæœŦをå­ĻばãĒくãĻはãĒりぞせん。 + +## 一čˆŦįš„ã‚ŗãƒŧデック + +**一čˆŦįš„ãĒビデã‚Ēã‚ŗãƒŧãƒ‡ãƒƒã‚¯ãŽčƒŒåžŒãĢあるä¸ģãĒ抟構**をį´šäģ‹ã—ãĻいきぞすが、これらぎæĻ‚åŋĩぎãģとんおは VP9、AV1、HEVCぎようãĒ最新ぎã‚ŗãƒŧデックでもåŊšãĢįĢ‹ãĄã€äŊŋわれãĻいぞす。į‰Šäē‹ã‚’かãĒり単į´”ãĢしãĻčĒŦ明することはį†č§ŖしãĻください。ときおき原際ぎ䞋(だいたいはH.264)をäŊŋãŖãĻ、技æŗ•ãŽãƒ‡ãƒĸã‚’čĄŒã„ãžã™ã€‚ + +## ゚テップīŧ‘ - į”ģåƒåˆ†å‰˛ + +最初ぎ゚テップは、いくつかぎ**パãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ、ã‚ĩブパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ**、もãŖとį´°ã‹ã„単äŊãĢ**フãƒŦãƒŧãƒ ã‚’åˆ†å‰˛**することです。 + +![picture partitioning](/i/picture_partitioning.png "į”ģåƒåˆ†å‰˛") + +**しかしãĒぜ?** たくさんぎį†į”ąãŒã‚りぞす。䞋えば、į”ģåƒã‚’åˆ†å‰˛ã™ã‚‹ã¨å°ã•ãĒパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗを動きぎある小さãĒ部分ãĢäŊŋい、より大きãĒパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗを静įš„ãĒčƒŒæ™¯ãĢäŊŋãŖãĻ、äēˆæ¸Ŧをよりæ­ŖįĸēãĢčĄŒã†ã“ã¨ãŒã§ããžã™ã€‚ + +通常は、CODECは、゚ナイ゚(もしくはã‚ŋイãƒĢ)、マクロ(もしくはįŦĻåˇãƒ„ãƒĒãƒŧãƒĻニット)やたくさんぎã‚ĩブパãƒŧテã‚ŖãƒŗãĢ **パãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗを構造化しぞす**。これらぎパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗぎ最大ã‚ĩイã‚ēは様々で、HEVCでは64x64、AVC16x16ですが、ã‚ĩブパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗは4x4ぞでです。 + +**フãƒŦãƒŧムはį¨ŽéĄžãĢ分けられãĻいる**ぎをå­ĻんだことをčĻšãˆãĻいぞすかīŧŸ**さãĻã€ã“ã‚Œã‚‰ãŽč€ƒãˆã‚’ãƒ–ãƒ­ãƒƒã‚¯ãĢ遊į”¨ã™ã‚‹**こともできぞす。それで、I゚ナイ゚、B゚ナイ゚、IマクロブロックãĒおを持つことができぞす。 + +> ### ハãƒŗã‚ēã‚Ēãƒŗ: パãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗをčĒŋずる +> [Intel Video Pro Analyzer](https://software.intel.com/en-us/intel-video-pro-analyzer) (有料ですが、最初ぎ10フãƒŦãƒŧムãĢåˆļ限されたį„Ąæ–™ãŠčŠĻしį‰ˆã‚‚ありぞす)をäŊŋうこともできぞす。これが分析された[VP9パãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ](/encoding_pratical_examples.md#transcoding)です。 +> +> ![VP9 partitions view inte ](/i/paritions_view_intel_video_pro_analyzer.png "VP9 パãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗビãƒĨãƒŧ intel video pro analyzer") + +## ゚テップīŧ’ - äēˆæ¸Ŧ + +パãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗãĢåˆ†å‰˛ã™ã‚‹ã¨ã€ãã‚Œã‚‰ãĢついãĻäēˆæ¸Ŧã‚’čĄŒã†ã“ã¨ãŒã§ããžã™ã€‚[イãƒŗã‚ŋãƒŧäēˆæ¸Ŧ](#temporal-redundancy-inter-prediction)ぎためãĢ、**動きベクトãƒĢã¨åˇŽåˆ†ã‚’é€ã‚‹**åŋ…čĻãŒã‚り、ぞた[イãƒŗトナäēˆæ¸Ŧ](#spatial-redundancy-intra-prediction)ぎためãĢ、**äēˆæ¸Ŧæ–šå‘ã¨åˇŽåˆ†**を送るåŋ…čĻãŒã‚りぞす。 + +## ゚テップīŧ“ - 変換 + +åˇŽåˆ†ãƒ–ãƒ­ãƒƒã‚¯ (`äēˆæ¸Ŧパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ - 原際ぎパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ`)をį”Ÿæˆã—た垌、**大ぞかãĒį”ģčŗĒ**をäŋãŖたぞぞおぎ**ピクã‚ģãƒĢを捨ãĻられるか**が分かるようãĢ、**変換**ã‚’čĄŒã†ã“ã¨ãŒã§ãã‚‹ 。ぞさãĢãã‚Œã‚’čĄŒã†ãŸã‚ãĢはいくつかぎ変換が存在しぞす。 + +[äģ–ぎ変換](https://en.wikipedia.org/wiki/List_of_Fourier-related_transforms#Discrete_transforms)もありぞすが、é›ĸæ•Ŗã‚ŗã‚ĩイãƒŗ変換(DCT)をしãŖかりčĻ‹ãĻいきぞす。[**DCT**](https://en.wikipedia.org/wiki/Discrete_cosine_transform)ぎä¸ģãĒį‰šåž´ã¯: + +* **ピクã‚ģãƒĢ**ぎブロックを同じã‚ĩイã‚ēぎ**周æŗĸ数äŋ‚æ•°**ブロックãĢ**変換する**。 +* エネãƒĢã‚Žãƒŧを**圧į¸Ž**しãĻ、įŠē間įš„å†—é•ˇæ€§ã‚’å‰Šæ¸›ã—ã‚„ã™ãã™ã‚‹ã€‚ +* **元ãĢæˆģせる**、ぞたはピクã‚ģãƒĢãĢæˆģせる + +> 2017åš´2月2æ—ĨãĢCintra, R. J.とBayer, F. Mが[14加įŽ—ぎãŋぎį”ģ像圧į¸Žį”¨DCTčŋ‘äŧŧ変換](https://arxiv.org/abs/1702.00817)というčĢ–文をį™ēčĄ¨ã—ãžã—ãŸã€‚ + +įŽ‡æĄæ›¸ããŽåˆŠį‚šã‚’å…¨ãĻį†č§ŖしãĒかãŖたとしãĻもåŋƒé…ã„りぞせん。そぎæœŦåŊ“ãŽäžĄå€¤ã‚’čĻ‹ã„å‡ēすためãĢいくつかぎ原験をčŠĻãŋãĻãŋぞす。 + +æŦĄãŽ**ピクã‚ģãƒĢぎブロック** (8x8)ã‚’äž‹ãĢとりぞしょう: + +![pixel values matrix](/i/pixel_matrice.png "ピクã‚ģãƒĢ値マトãƒĒク゚") + +これはブロックį”ģ像(8x8)を描į”ģしぞす: + +![pixel values matrix](/i/gray_image.png "ピクã‚ģãƒĢ値マトãƒĒク゚") + +こぎピクã‚ģãƒĢぎブロックãĢ**DCTを遊į”¨ã™ã‚‹**と**äŋ‚数ぎブロック** (8x8)を垗ぞす: + +![coefficients values](/i/dct_coefficient_values.png "äŋ‚数ぎ値") + +こぎäŋ‚数ぎブロックを描į”ģすれば、こぎį”ģ像を垗るでしょう。: + +![dct coefficients image](/i/dct_coefficient_image.png "dctäŋ‚æ•°į”ģ像") + +元ぎį”ģ像とはäŧŧãĻもäŧŧつかãĒいことが分かり、**最初ぎäŋ‚æ•°**はäģ–ぎäŋ‚数とは全くį•°ãĒãŖãĻいることãĢ気ãĨくかもしれぞせん。 こぎ最初ぎäŋ‚数はDCäŋ‚数としãĻįŸĨられ、å…Ĩ力配列ぎ**ã‚ĩãƒŗプãƒĢ全äŊ“**ã‚’čĄ¨ã—ãžã™ã€‚äŊ•ã‹**åšŗ均ãĢäŧŧãĻる**もぎです。 + +こぎäŋ‚数ぎブロックはéĢ˜å‘¨æŗĸ数成分をäŊŽå‘¨æŗĸ数成分から切りé›ĸすというéĸį™Ŋいį‰šæ€§ã‚’持ãŖãĻいぞす。 + +![dct frequency coefficients property](/i/dctfrequ.jpg "dct周æŗĸ数äŋ‚æ•°į‰šæ€§") + +į”ģ像では、**エネãƒĢã‚Žãƒŧぎãģとんお**は[**äŊŽå‘¨æŗĸ数**](https://web.archive.org/web/20150129171151/https://www.iem.thm.de/telekom-labor/zinke/mk/mpeg2beg/whatisit.htm)ãĢ集中されぞす。それでį”ģ像を周æŗĸ数成分ãĢ変換しãĻ**éĢ˜å‘¨æŗĸ数äŋ‚数を捨ãĻ**れば、į”ģčŗĒをそれãģおįŠ į‰˛ãĢせずãĢį”ģåƒã‚’čĄ¨įžã™ã‚‹ãŽãĢåŋ…čĻãĒ**デãƒŧã‚ŋ量を削減**できぞす。 + +> 周æŗĸ数はäŋĄåˇãŒãŠã‚Œã ã‘速く変化するかを意å‘ŗしぞす。 + +では垗られたįŸĨč­˜ã‚’äŊŋãŖãĻ、元ぎį”ģ像をDCTをäŊŋãŖãĻ周æŗĸ数(äŋ‚数ぎブロック)ãĢ変換しãĻ、もãŖとも重čĻã§ãĒいäŋ‚数ぎ部分を捨ãĻる原験をしãĻãŋぞしょう。 + +ぞず、į”ģ像を**周æŗĸ数領域**ãĢ変換しぞす。 + +![coefficients values](/i/dct_coefficient_values.png "周æŗĸ数値") + +æŦĄãĢ、äŋ‚数ぎ一部(67%)を捨ãĻぞす。捨ãĻるぎはãģとんおはåŗ下ぎ部分です。 + +![zeroed coefficients](/i/dct_coefficient_zeroed.png "ã‚ŧロãĢしたäŋ‚æ•°") + +最垌ãĢ、こぎ一部が捨ãĻられたäŋ‚数ぎブロックからį”ģ像を再į”Ÿæˆã—(元ãĢæˆģせるåŋ…čĻãŒã‚ることをčĻšãˆãĻおいãĻください)、元ぎį”ģ像と比čŧƒã—ぞす。 + +![original vs quantized](/i/original_vs_quantized.png "元 vs 量子化垌") + +こぎį”ģ像は元ぎį”ģ像とäŧŧãĻいぞすが、多くぎį›¸é•į‚šãŒį™ēį”Ÿã—ãĻいぞす。**67.1875%を捨ãĻぞした**が、 少ãĒくとも元ぎį”ģ像ãĢäŧŧãĻいるį”ģ像を垗ることができぞした。よりįŸĨįš„ãĢäŋ‚数を捨ãĻãĻ、もãŖとį”ģčŗĒã‚’č‰¯ãã™ã‚‹ã“ã¨ã‚‚ã§ããžã—ãŸãŒã€ãã‚Œã¯æŦĄãŽãƒˆãƒ”ックです。 + +> **それぞれぎäŋ‚数はį”ģį´ å…¨äŊ“ã‚’äŊŋãŖãĻåŊĸ成される** +> +> それぞれぎäŋ‚数は、īŧ‘つぎį”ģį´ ãĢį›´æŽĨマッピãƒŗグしãĻいるわけではãĒく、į”ģį´ å…¨äŊ“ぎ重ãŋäģ˜ãåˆč¨ˆã§ã‚ることãĢį•™æ„ã™ã‚‹ã“とは重čĻã§ã™ã€‚こぎį´ æ™´ã‚‰ã—いグナフは、1į•Ēį›Žã¨2į•Ēį›ŽãŽäŋ‚数が、それぞれぎイãƒŗデック゚でį•°ãĒる重ãŋをäŊŋãŖãĻ、おぎようãĢ計įŽ—されるかをį¤ēしãĻいぞす。 +> +> ![dct calculation](/i/applicat.jpg "dct計įŽ—") +> +> 原典: https://web.archive.org/web/20150129171151/https://www.iem.thm.de/telekom-labor/zinke/mk/mpeg2beg/whatisit.htm +> +> DCTåŸēåē•ã”とぎ[単į´”ãĒį”ģ像ぎåŊĸ成をčĻ‹ãĻDCTをčĻ–čĻšåŒ–する](/dct_better_explained.ipynb)こともできぞす。䞋えば、これはそれぞれぎäŋ‚数ぎ重ãŋををäŊŋãŖãĻ[īŧ‘つぎ文字がåŊĸ成されãĻいく](https://en.wikipedia.org/wiki/Discrete_cosine_transform#Example_of_IDCT)過į¨‹ã§ã™ã€‚ +> +> ![](https://upload.wikimedia.org/wikipedia/commons/5/5e/Idct-animation.gif ) + + + + +
+ +> ### ハãƒŗã‚ēã‚Ēãƒŗ: į¨Žã€…ぎäŋ‚数を捨ãĻる +> [DCT変換](/uniform_quantization_experience.ipynb)を原験できぞす。 + +## ゚テップīŧ” - 量子化 + +前ぎ゚テップ (変換)でäŋ‚数をいくつか捨ãĻるときãĢ、量子化ぎようãĒã‚‚ãŽã‚’čĄŒã„ãžã—ãŸã€‚ ã“ãŽã‚šãƒ†ãƒƒãƒ—ã§ã¯ã€æå¤ąã™ã‚‹æƒ…å ą(**æå¤ąéƒ¨åˆ†**)を選ãŗぞす。単į´”ãĒč¨€č‘‰ã§ã„ã†ã¨ã€**圧į¸Žã‚’成し遂げるためãĢäŋ‚数を量子化**しぞす。 + +おぎようãĢäŋ‚数ぎブロックを量子化できるでしょうかīŧŸīŧ‘つぎ単į´”ãĒæ–šæŗ•ã¯ã€å‡ä¸€é‡å­åŒ–でしょう。ブロックを**単一値** (10) **ã§å‰˛ã‚Š**、小数į‚šã‚’切り捨ãĻぞす。 + +![quantize](/i/quantize.png "量子化") + +おぎようãĢこぎäŋ‚数ぎブロックを**元ãĢæˆģす** (再量子化)できるでしょうかīŧŸ**同じ値** (10)**を掛ける**ことãĢよりæˆģすことができぞす。 + +![re-quantize](/i/re-quantize.png "再量子化") + +こぎ**やり斚は最遊ãĒæ–šæŗ•ã§ã¯ã‚りぞせん**。それぞれぎäŋ‚数ぎ重čĻåēĻã‚’č€ƒæ…Žã—ãĻいãĒいからです。 単一値ぎäģŖわりãĢ**量子化マトãƒĒク゚**をäŊŋうことができぞした。こぎマトãƒĒク゚はDCTぎį‰šæ€§ã‚’æ´ģかすことができぞす。åŗ下を一į•Ē量子化しãĻ、åˇĻ上はあぞり量子化しぞせん。[JPEGはäŧŧたやり斚をäŊŋãŖãĻいぞす](https://www.hdm-stuttgart.de/~maucher/Python/MMCodecs/html/jpegUpToQuant.html)。[ã‚Ŋãƒŧã‚šã‚ŗãƒŧド上でこぎマトãƒĒク゚をčĻ‹ã‚‹](https://github.com/google/guetzli/blob/master/guetzli/jpeg_data.h#L40)ことができぞす。 + +> ### ハãƒŗã‚ēã‚Ēãƒŗ: 量子化 +> [量子化](/dct_experiences.ipynb)を原験できぞす。 + +## ゚テップīŧ•- エãƒŗトロピãƒŧįŦĻåˇåŒ– + +デãƒŧã‚ŋ(į”ģ像 ブロック/゚ナイ゚/フãƒŦãƒŧム)を量子化した垌、さらãĢ可逆圧į¸Žã™ã‚‹ã“とができぞす。デãƒŧã‚ŋ圧į¸ŽãŽãŸã‚ãŽãŸãã•ã‚“ぎ斚æŗ•(ã‚ĸãƒĢゴãƒĒã‚ēム)が存在しぞす。それらぎいくつかをį°Ąå˜ãĢäŊ“験しãĻã„ããžã™ã€‚ã‚ˆã‚Šæˇąã„į†č§ŖぎためãĢは、こぎį´ æ™´ã‚‰ã—いæœŦ[Understanding Compression: Data Compression for Modern Developers](https://www.amazon.com/Understanding-Compression-Data-Modern-Developers/dp/1491961538/)をčĒ­ã‚€ã¨ã‚ˆã„でしょう。 + +### å¯å¤‰é•ˇįŦĻåˇåŒ–: + +č¨˜åˇãŽã‚šãƒˆãƒĒãƒŧムを持ãŖãĻいるとしぞす: **a**、**e**、**r**、**t**とそれらぎįĸēįŽ‡(0から1)がこぎテãƒŧブãƒĢã§čĄ¨ã•ã‚ŒãĻいぞす。 + +| | a | e | r | t | +|-------------|-----|-----|------|-----| +| įĸēįŽ‡ | 0.3 | 0.3 | 0.2 | 0.2 | + +もãŖともįĸēįŽ‡ãŒå¤§ãã„もぎãĢは(より小さãĒ)ãƒĻニãƒŧクãĒバイナãƒĒã‚ŗãƒŧドを、もãŖともįĸēįŽ‡ãŒäŊŽã„もぎãĢはより大きãĒバイナãƒĒã‚ŗãƒŧãƒ‰ã‚’å‰˛ã‚ŠåŊ“ãĻることができぞす。 + +| | a | e | r | t | +|-------------|-----|-----|------|-----| +| probability | 0.3 | 0.3 | 0.2 | 0.2 | +| binary code | 0 | 10 | 110 | 1110 | + +゚トãƒĒãƒŧム **eat**を圧į¸Žã—ãĻãŋãžã—ã‚‡ã†ã€‚ãã‚Œãžã‚ŒãŽč¨˜åˇãĢ8ビットäŊŋうと、圧į¸ŽãĒしで**24ビット**äŊŋうことãĢãĒã‚Šãžã™ã€‚ã—ã‹ã—ã€ãã‚Œãžã‚ŒãŽč¨˜åˇã‚’ããŽã‚ŗãƒŧドでįŊŽãæ›ãˆã‚‹ã¨ã€ã‚šãƒšãƒŧã‚šã‚’į¯€į´„できぞす。 + +ãžãšč¨˜åˇ**e**をįŦĻåˇåŒ–ã—ãĻ`10`ãĢãĒりぞす。īŧ’つį›ŽãŽč¨˜åˇ**a**をįŦĻåˇåŒ–ã™ã‚‹ã¨ã€čļŗされãĻ(数å­Ļぎ斚æŗ•ã§ã¯ãĒく) `[10][0]`とãĒりぞす。最垌ãĢīŧ“つį›ŽãŽč¨˜åˇã‚’įŦĻåˇåŒ–**t**をįŦĻåˇåŒ–ã™ã‚‹ã¨ã€æœ€įĩ‚įš„ãĒ圧į¸Žã•ã‚ŒãŸãƒ“ット゚トãƒĒãƒŧムは `[10][0][1110]`もしくは`1001110`とãĒり、(もとより3.4倍小さãĒ゚ペãƒŧ゚である)**7ビット**しかäŊŋいぞせん。 + +それぞれぎã‚ŗãƒŧドはãƒĻニãƒŧクãĒæŽĨé ­įŦĻåˇã§ã‚ã‚‹åŋ…čĻãŒã‚ることãĢæŗ¨æ„ã—ãĻください [ハフマãƒŗがこれらぎ数字をčĻ‹ã¤ã‘ることを劊けãĻくれぞす](https://en.wikipedia.org/wiki/Huffman_coding)ã€‚ã„ãã¤ã‹ãŽå•éĄŒãŒã‚ã‚Šãžã™ãŒã€ã“ãŽæ–šæŗ•ã‚’[äģŠã§ã‚‚ã‚ĩポãƒŧトするビデã‚Ēã‚ŗãƒŧデック](https://en.wikipedia.org/wiki/Context-adaptive_variable-length_coding)が存在しぞす。これは圧į¸Žã‚’åŋ…čĻã¨ã™ã‚‹ãŸãã•ã‚“ぎã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗぎためぎã‚ĸãƒĢゴãƒĒã‚ēムです。 + +エãƒŗã‚ŗãƒŧダãƒŧとデã‚ŗãƒŧダãƒŧãŽä¸Ąæ–šãŒããŽã‚ŗãƒŧãƒ‰ãŽč¨˜åˇãƒ†ãƒŧブãƒĢを**įŸĨらãĒくãĻはいけぞせん**。それで、テãƒŧブãƒĢも送るåŋ…čĻãŒã‚りぞす。 + +### įŽ—襓įŦĻåˇ: + +č¨˜åˇ: **a**, **e**, **r**, **s**, **t** ぎ゚トãƒĒãƒŧムを持ãŖãĻいãĻ、それらぎįĸēįŽ‡ãŒã“ãŽčĄ¨ãĢよãŖãĻčĄ¨ã•ã‚Œã‚‹ã¨äģŽåŽšã—ぞしょう。 + +| | a | e | r | s | t | +|-------------|-----|-----|------|------|-----| +| probability | 0.3 | 0.3 | 0.15 | 0.05 | 0.2 | + +ã“ãŽčĄ¨ã‚’č€ƒæ…ŽãĢå…ĨれãĻ、å‡ēįžé †ãĢã‚Ŋãƒŧトされた全ãĻぎ可čƒŊãĒč¨˜åˇã‚’åĢむį¯„å›˛ãŽã‚°ãƒŠãƒ•ã‚’äŊœã‚‹ã“とができぞす。 + +![initial arithmetic range](/i/range.png "初期įŽ—襓į¯„å›˛") + +さãĻ、゚トãƒĒãƒŧム **eat**をįŦĻåˇåŒ–ã—ãĻãŋãžã—ã‚‡ã†ã€‚æœ€åˆãŽč¨˜åˇ**e**を取り上げぞす。それは*0.3äģĨ上0.6æœĒæē€**ãĢäŊįŊŽã—ãĻいぞす。こぎ部分į¯„å›˛ã‚’å–ã‚Šä¸Šã’ã€ãã‚Œã‚’å†ãŗåŒã˜å‰˛åˆã§åˆ†å‰˛ã—ãžã™ã€‚ + +![second sub range](/i/second_subrange.png "2į•Ēį›ŽãŽéƒ¨åˆ†į¯„å›˛") + +゚トãƒĒãƒŧム**eat**ぎįŦĻåˇåŒ–ã‚’įļšã‘ぞしょう。æŦĄãĢč¨˜åˇ**a**を取り上げぞす。これは**0.3äģĨ上0.39æœĒæē€**ãĢ存在ぞす。そしãĻã€æœ€åžŒãŽč¨˜åˇ **t**を取り上げぞす。もう一åēĻ同じå‡Ļį†ã‚’čĄŒã†ã¨**0.354äģĨ上0.372æœĒæē€**という最įĩ‚įš„ãĒį¯„å›˛ã‚’åž—ãžã™ã€‚ + +![final arithmetic range](/i/arithimetic_range.png "最įĩ‚įš„ãĒįŽ—襓į¯„å›˛") + +最įĩ‚į¯„å›˛**0.354äģĨ上0.372æœĒæē€**からīŧ‘つぎ数値を取り上げるåŋ…čĻãŒã‚りぞす。**0.36**を取り上げぞしょう。しかしこぎ部分į¯„å›˛ãĒいãĒらおんãĒ数値を選んでもかぞいぞせん。こぎ数値**だけで**、元ぎ゚トãƒĒãƒŧム**eat**を垊元することができぞす。これは、゚トãƒĒãƒŧムをįŦĻåˇåŒ–ã™ã‚‹į‚ēãĢį¯„å›˛ãŽį¯„å›˛ãĢįˇšã‚’åŧ•ãã‹ãŽã‚ˆã†ãĢ捉えることができぞす。 +![final range traverse](/i/range_show.png "最įĩ‚į¯„å›˛æ¨Ē断") + +**逆過į¨‹** (åˆĨåã€€åžŠåˇåŒ–) は同様ãĢį°Ąå˜ã§ã€æ•°å€¤**0.36**と元ぎį¯„å›˛ã‚’äŊŋãŖãĻ、同じå‡Ļį†ã‚’čĄŒã„ã€ã“ãŽæ•°å€¤ã‹ã‚‰įŦĻåˇåŒ–ã•ã‚ŒãŸã‚šãƒˆãƒĒãƒŧムを明らかãĢしぞす。 + +最初ぎį¯„å›˛ã§ã€ããŽæ•°å€¤ãŒīŧ‘つぎ部分ãĢä¸€č‡´ã—ã€ãã‚ŒãŒæœ€åˆãŽč¨˜åˇã§ã‚ã‚‹ã“ã¨ãĢ気ãĨきぞす。それから、そぎ部分į¯„å›˛ã‚’äģĨå‰čĄŒãŖたようãĢãžãŸåˆ†å‰˛ã—ãžã™ã€‚ã™ã‚‹ã¨**0.36**ãŒč¨˜åˇ**a**ãĢ合うことがわかり、同じå‡Ļį†ã‚’įš°ã‚Ščŋ”ã™ã¨ã€æœ€åžŒãŽč¨˜åˇã§ã‚ã‚‹**t**をčĻ‹ã¤ã‘ぞす(įŦĻåˇå‰ãŽã‚šãƒˆãƒĒãƒŧム*eat*をåŊĸ成しぞす)。 + +įŦĻåˇåŒ–ã¨åžŠåˇåŒ–ãŽį™‚æŗ•ã¯ã€č¨˜åˇįĸēįŽ‡ãƒ†ãƒŧブãƒĢを**įŸĨるåŋ…čĻãŒã‚りぞす**。それでテãƒŧブãƒĢを送äŋĄã™ã‚‹åŋ…čĻãŒã‚りぞす。 + +į´ æ™´ã‚‰ã—いですよね。äēē々はæœŦåŊ“ãĢčŗĸく、こぎようãĒč§Ŗæąēį­–ã‚’į”Ÿãŋå‡ēしぞした。いくつかぎ[ビデã‚Ēã‚ŗãƒŧデック](https://en.wikipedia.org/wiki/Context-adaptive_binary_arithmetic_coding)はこぎ技æŗ•ã‚’äŊŋãŖãĻいぞす。(もしくは少ãĒくともã‚Ēãƒ—ã‚ˇãƒ§ãƒŗとしãĻ提䞛しãĻいぞす)。 + +ã“ãŽč€ƒãˆã¯ã€é‡å­åŒ–ãƒ“ãƒƒãƒˆã‚šãƒˆãƒĒãƒŧムを可逆圧į¸Žã™ã‚‹į‚ēぎもぎです。間違いãĒãã“ãŽč¨˜äē‹ã§ã¯äŧãˆãã‚ŒãĻいãĒいčŠŗį´°ã€į†į”ąã€ãƒˆãƒŦãƒŧドã‚Ēフį­‰ãŒåąąãŽã‚ˆã†ãĢありぞす。しかし、čĒ­č€…はデベロッパãƒŧとしãĻ[もãŖとå­Ļãļずきです](https://www.amazon.com/Understanding-Compression-Data-Modern-Developers/dp/1491961538/)。より新しいã‚ŗãƒŧデックはåˆĨぎ[ANSぎようãĒエãƒŗトロピãƒŧįŦĻåˇåŒ–ã‚ĸãƒĢゴãƒĒã‚ēム](https://en.wikipedia.org/wiki/Asymmetric_Numeral_Systems)をäŊŋおうとしãĻいぞす。 + +> ### Hands-on: CABAC vs CAVLC +> [īŧ‘つはCABAC、もう一斚はCAVLCをäŊŋãŖãĻīŧ’つぎ゚トãƒĒãƒŧムをį”Ÿæˆ](https://github.com/leandromoreira/introduction_video_technology/blob/master/encoding_pratical_examples.md#cabac-vs-cavlc)し、į”Ÿæˆã™ã‚‹į‚ēãĢかかる**時間と最įĩ‚įš„ãĒã‚ĩイã‚ēを比čŧƒã—**しãĻãŋぞしょう。 + +## ゚テップ6 - ビット゚トãƒĒãƒŧムフりãƒŧマット + +これらぎ゚テップ全ãĻã‚’čĄŒãŖた垌、**圧į¸Žã•ã‚ŒãŸãƒ•ãƒŦãƒŧムとこれらぎ゚テップぞでぎįŠļæŗã‚’パック**するåŋ…čĻãŒã‚りぞす。 **エãƒŗã‚ŗãƒŧダãĢよãŖãĻãĒされたæąē厚**ãĢついãĻデã‚ŗãƒŧダへ明į¤ēįš„ãĢįŸĨらせるåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãƒ“ãƒƒãƒˆæˇąåēĻã€č‰˛įŠē間、č§Ŗ像åēĻ、äēˆæ¸Ŧæƒ…å ąīŧˆå‹•ããƒ™ã‚¯ãƒˆãƒĢ、イãƒŗトナäēˆæ¸Ŧ斚向īŧ‰ã€ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢãƒŦベãƒĢ、フãƒŦãƒŧムãƒŦãƒŧト、フãƒŦãƒŧムã‚ŋイプ、フãƒŦãƒŧム数、そぎäģ–多数です。 + +H.264ビット゚トãƒĒãƒŧムãĢついãĻ襨éĸįš„ãĢå­Ļんでいきぞす。最初ぎ゚テップは[最小限ぎH.264 *ビット゚トãƒĒãƒŧムをį”Ÿæˆã™ã‚‹](/encoding_pratical_examples.md#generate-a-single-frame-h264-bitstream)ことです。こぎãƒŦポジトãƒĒと[ffmpeg](http://ffmpeg.org/)をäŊŋãŖãĻ、これができぞす。 + +``` +./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264 +``` + +> * ffmpegは、デフりãƒĢトで**SEI NAL**としãĻįŦĻåˇåŒ–ã•ã‚ŒãŸå…¨ãƒ‘ãƒŠãƒĄãƒŧã‚ŋを加えぞす。NALがãĒんであるかはすぐãĢ厚įžŠã—ぞす。 + +こぎã‚ŗマãƒŗドは、**単一フãƒŦãƒŧム**、64x64ã€č‰˛įŠē間がyuv420、æŦĄãŽį”ģ像をフãƒŦãƒŧムとしãĻつかãĻいるį”ŸãŽh264ビット゚トãƒĒãƒŧムをį”Ÿæˆãžã™ã€‚ + +> ![used frame to generate minimal h264 bitstream](/i/minimal.png "最小h264ビット゚トãƒĒãƒŧムをį”Ÿæˆã™ã‚‹ãƒ•ãƒŦãƒŧムをäŊŋãŖた") + +### H.264ビット゚トãƒĒãƒŧム + +AVC (H.264)標æē–ã¯ã€æƒ…å ąãŒ**マクロフãƒŦãƒŧム** (ネットワãƒŧクįš„ãĢは), **[NAL](https://en.wikipedia.org/wiki/Network_Abstraction_Layer)** (Network Abstraction Layer)とå‘ŧばれるåŊĸで送られることを厚įžŠã—ãĻいぞす。NALぎä¸ģãĒį›Žįš„は、"ネットワãƒŧクフãƒŦãƒŗドãƒĒãƒŧ"ãĒビデã‚Ē襨įžã‚’提䞛することです。こぎ標æē–は、TV (゚トãƒĒãƒŧムベãƒŧã‚š)、イãƒŗã‚ŋãƒŧネット(ãƒ‘ã‚ąãƒƒãƒˆãƒ™ãƒŧã‚š)やそぎäģ–で動äŊœã—ãĒければãĒりぞせん。 + +![NAL units H.264](/i/nal_units.png "NALãƒĻニット H.264") + +NALãƒĻニットぎåĸƒį•Œã‚’厚įžŠã™ã‚‹**[同期マãƒŧã‚Ģãƒŧ](https://en.wikipedia.org/wiki/Frame_synchronization)**がありぞす。それぞれぎ同期マãƒŧã‚Ģãƒŧは、一į•Ē最初が`0x00 0x00 0x00 0x01`であることを除き`0x00 0x00 0x01`ぎ値を持つ。もしį”Ÿæˆã•ã‚ŒãŸh264ビット゚トãƒĒãƒŧム上で**16é€˛ãƒ€ãƒŗプ**ã‚’čĄŒãˆã°ã€ãƒ•ã‚Ąã‚¤ãƒĢぎ最初ぎ斚ãĢ、少ãĒくともīŧ“つぎNALをčĻ‹ã¤ã‘ることができぞす。 + +![synchronization marker on NAL units](/i/minimal_yuv420_hex.png "NALãƒĻニットぎ同期マãƒŧã‚Ģãƒŧ") + +先ãĢčŋ°ãšãŸã¨ãŠã‚Šã€ãƒ‡ã‚ŗãƒŧダはį”ģ像デãƒŧã‚ŋだけではãĒく、動į”ģ、フãƒŦãƒŧãƒ ã€č‰˛ã€äŊŋį”¨ã•ã‚ŒãŸãƒ‘ãƒŠãƒĄãƒŧã‚ŋ、そぎäģ–ぎčŠŗį´°ã‚’įŸĨるåŋ…čĻãŒã‚りぞす。それぞれぎNALぎ**最初ぎバイト**は、そぎã‚ĢテゴãƒĒと**ã‚ŋイプ**を厚įžŠã—ぞす。. + +| NAL ã‚ŋイプID | čĒŦ明 | +|--- |---| +| 0 | æœĒ厚įžŠ | +| 1 | 非IDRピクチãƒŖぎįŦĻåˇåŒ–ã‚šãƒŠã‚¤ã‚š | +| 2 | įŦĻåˇåŒ–ã‚šãƒŠã‚¤ã‚šãƒ‡ãƒŧã‚ŋパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ A | +| 3 | įŦĻåˇåŒ–ã‚šãƒŠã‚¤ã‚šãƒ‡ãƒŧã‚ŋパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ B | +| 4 | įŦĻåˇåŒ–ã‚šãƒŠã‚¤ã‚šãƒ‡ãƒŧã‚ŋパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ C | +| 5 | IDRピクチãƒŖぎ**IDR**įŦĻåˇåŒ–ã‚šãƒŠã‚¤ã‚š | +| 6 | **SEI** äģ˜åŠ æ‹Ąåŧĩæƒ…å ą | +| 7 | **SPS** ã‚ˇãƒŧã‚ąãƒŗã‚šãƒ‘ãƒŠãƒĄãƒŧã‚ŋã‚ģット | +| 8 | **PPS** ピクチãƒŖãƒ‘ãƒŠãƒĄãƒŧã‚ŋã‚ģット | +| 9 | ã‚ĸクã‚ģã‚šãƒĻニットデãƒĒミã‚ŋãƒŧ | +| 10 | ã‚ˇãƒŧã‚ąãƒŗ゚ぎ最垌 | +| 11 | ゚トãƒĒãƒŧムぎ最垌 | +| ... | ... | + +晎通は、ビット゚トãƒĒãƒŧムぎ最初ぎNALは**SPS**で、こぎã‚ŋイプぎNALは、**ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢ**、**ãƒŦベãƒĢ**、**č§Ŗ像åēĻ**やそぎäģ–ãŽæąŽį”¨ã‚¨ãƒŗã‚ŗãƒŧデã‚Ŗãƒŗグ変数をįŸĨらせるåŊšå‰˛ã‚’æŒãĄãžã™ã€‚ + +最初ぎ同期マãƒŧã‚Ģãƒŧを゚キップすると、**最初ぎバイト**ã‚’åžŠåˇåŒ–ã—ãĻ**NALぎã‚ŋイプ**がäŊ•ã‹ã‚’įŸĨることができぞす。 + +䞋えば、同期マãƒŧã‚Ģãƒŧぎ最初ぎバイトは`01100111`です。最初ぎビット (`0`)は**forbidden_zero_bit**フã‚ŖãƒŧãƒĢドで、æŦĄãŽ2ビット(`11`)は**nal_ref_idc**フã‚ŖãƒŧãƒĢドで、こぎNALが参į…§ãƒ•ã‚ŖãƒŧãƒĢドかおうかをį¤ēしぞす。掋りぎ5ビット (`00111`)は**nal_unit_type**フã‚ŖãƒŧãƒĢドで、こぎ䞋では**SPS** (7) NALãƒĻニットです。 + +SPS NALぎīŧ’バイトį›Ž(`īŧ’é€˛æ•°=01100100、īŧ‘īŧ–é€˛æ•°=0x64、īŧ‘īŧé€˛æ•°=100`)は**profile_idc**フã‚ŖãƒŧãƒĢドで、エãƒŗã‚ŗãƒŧダがäŊŋãŖãŸãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢをį¤ēしぞす。こぎ䞋では、**[åˆļį´„äģ˜ããƒã‚¤ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢ](https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Profiles)**をäŊŋãŖãĻいぞす。これはB (双斚向äēˆæ¸Ŧ)゚ナイ゚をã‚ĩポãƒŧトしãĒã„ãƒã‚¤ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢです。 + +![SPS binary view](/i/minimal_yuv420_bin.png "SPSバイナãƒĒビãƒĨãƒŧ") + +SPS NALãĢついãĻH.264ビット゚トãƒĒãƒŧムäģ•æ§˜ã‚’čĒ­ã‚€ã¨ã€**ãƒ‘ãƒŠãƒĄãƒŧã‚ŋ名**、**ã‚ĢテゴãƒĒ**、**čĒŦ明**ãĢ多くぎ値をčĻ‹ã¤ã‘るでしょう。䞋えば、`pic_width_in_mbs_minus_1`と`pic_height_in_map_units_minus_1`フã‚ŖãƒŧãƒĢドãĢついãĻčĻ‹ãĻãŋぞしょう。 + +| ãƒ‘ãƒŠãƒĄãƒŧã‚ŋ名 | ã‚ĢテゴãƒĒ | čĒŦ明 | +|--- |---|---| +| pic_width_in_mbs_minus_1 | 0 | ue(v) | +| pic_height_in_map_units_minus_1 | 0 | ue(v) | + +> **ue(v)**: įŦĻåˇãĒし整数 [Exp-Golomb-coded](https://pythonhosted.org/bitstring/exp-golomb.html) + +これらぎフã‚ŖãƒŧãƒĢドぎ値ãĢ寞しãĻã‚ã‚‹č¨ˆįŽ—をすると、**č§Ŗ像åēĻ**を垗ることができぞす。`1920 x 1080`を`pic_width_in_mbs_minus_1`が`119 ( (119 + 1) * macroblock_size = 120 * 16 = 1920) `としãĻ襨įžã™ã‚‹ã“とができぞす。įŠē間をさらãĢį¯€į´„するためãĢ、`1920`をįŦĻåˇåŒ–ã™ã‚‹äģŖわりãĢ、`119`をäŊŋいぞした。 + +į”Ÿæˆã•ã‚ŒãŸãƒ“デã‚ĒをバイナãƒĒビãƒĨãƒŧ (䞋えば: `xxd -b -c 11 v/minimal_yuv420.h264`)で検æŸģしįļšã‘ると、最垌ぎNALぞで゚キップすることができぞす。それはフãƒŦãƒŧムč‡ĒčēĢです。 + +![h264 idr slice header](/i/slice_nal_idr_bin.png "h264 IDR゚ナイ゚ヘッダãƒŧ") + +最初ぎīŧ–バイトぎ値をčĻ‹ã‚‹ã“とができぞす: `01100101 10001000 10000100 00000000 00100001 11111111`。すでãĢįŸĨãŖãĻる通り、最初ぎバイトでNALがäŊ•ã ã‹ã‚’įŸĨることができぞす。こぎ䞋では、(`00101`)で**IDR゚ナイ゚ (5)**です。さらãĢ検æŸģしãĻãŋぞす: + +![h264 slice header spec](/i/slice_header.png "h264゚ナイ゚ヘッダäģ•æ§˜") + +äģ•æ§˜ãŽæƒ…å ąã‚’äŊŋい、゚ナイ゚ぎã‚ŋイプ (**slice_type**)、フãƒŦãƒŧムį•Ēåˇ(**frame_num**)やäģ–ぎ重čĻãĒフã‚ŖãƒŧãƒĢãƒ‰ã‚’åžŠåˇã™ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ + +いくつかぎフã‚ŖãƒŧãƒĢドぎ値を垗るためãĢ(`ue(v)、me(v)、se(v)、te(v)`)、それを[Exponential-Golomb](https://pythonhosted.org/bitstring/exp-golomb.html)とå‘ŧばれるį‰šåˆĨãĒデã‚ŗãƒŧダãƒŧをäŊŋãŖãĻ、デã‚ŗãƒŧドするåŋ…čĻãŒã‚りぞす。こぎ斚æŗ•ã¯ã€å¤šããŽãƒ‡ãƒ•ã‚ŠãƒĢト値を持つ場合はたいãĻい、**変数値をįŦĻåˇåŒ–ã™ã‚‹ãŽãĢとãĻも劚įŽ‡įš„**です。 + +> こぎビデã‚Ēぎ**slice_type**と**frame_num**ぎ値は7 (I゚ナイ゚)と0 (最初ぎフãƒŦãƒŧム)です。 + +**ビット゚トãƒĒãƒŧムをプロトã‚ŗãƒĢとしãĻ**čĻ‹ã‚‹ã“とができぞす。こぎビット゚トãƒĒãƒŧムãĢついãĻもãŖとå­Ļãŗたいもしくはå­Ļãļåŋ…čĻãŒã‚ã‚‹ãĒら、[ITU H.264 spec.]( http://www.itu.int/rec/T-REC-H.264-201610-I)を参į…§ã—ãĻãã ã•ã„ã€‚ä¸‹č¨˜ã¯ãƒžã‚¯ãƒ­å›ŗčĄ¨ã§ã€ãƒ”ã‚¯ãƒãƒŖデãƒŧã‚ŋ(圧į¸ŽYUV)がおこãĢäŊįŊŽã™ã‚‹ã‹ã‚’į¤ēしãĻいぞす。 + +![h264 bitstream macro diagram](/i/h264_bitstream_macro_diagram.png "h264ビット゚トãƒĒãƒŧムマクロå›ŗ襨") + +[VP9ビット゚トãƒĒãƒŧム](https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf)や[H.265 (HEVC)](http://handle.itu.int/11.1002/1000/11885-en?locatt=format:pdf)や、さらãĢは**新しいベ゚トフãƒŦドである** [**AV1** bitstream](https://medium.com/@mbebenita/av1-bitstream-analyzer-d25f1c27072b#.d5a89oxz8 +)ぎビット゚トãƒĒãƒŧムをæŽĸį´ĸすることができぞす。[それらはãŋんãĒäŧŧãĻぞすかīŧŸã„いえ](http://www.gpac-licensing.com/2016/07/12/vp9-av1-bitstream-format/)、しかしīŧ‘つをå­Ļãļと、äģ–ぎはį°Ąå˜ãĢį†č§Ŗできぞす。 + +> ### ハãƒŗã‚ēã‚Ēãƒŗ: H.264ビット゚トãƒĒãƒŧムぎ検æŸģ +> [単一フãƒŦãƒŧムぎビデã‚Ēをį”Ÿæˆ](https://github.com/leandromoreira/introduction_video_technology/blob/master/encoding_pratical_examples.md#generate-a-single-frame-video)し、[mediainfo](https://en.wikipedia.org/wiki/MediaInfo)をäŊŋãŖãĻH.264ビット゚トãƒĒãƒŧムを検æŸģしãĻãŋぞしょう。原際、[h264 (AVC)ビット゚トãƒĒãƒŧムをパãƒŧ゚するã‚Ŋãƒŧã‚šã‚ŗãƒŧド](https://github.com/MediaArea/MediaInfoLib/blob/master/Source/MediaInfo/Video/File_Avc.cpp)をčĻ‹ã‚‹ã“とさえできぞす。 +> +> ![mediainfo details h264 bitstream](/i/mediainfo_details_1.png "mediainfoがh264ビット゚トãƒĒãƒŧムをčŠŗčŋ°ã™ã‚‹") +> +> [Intel Video Pro Analyzer](https://software.intel.com/en-us/intel-video-pro-analyzer)をäŊŋうこともできぞす。有料ですが、最初ぎ10フãƒŦãƒŧムãĢåˆļ限されたį„Ąæ–™ãŠčŠĻしį‰ˆã‚‚あり、å­Ļįŋ’į›Žįš„としãĻã¯å•éĄŒã‚ã‚Šãžã›ã‚“ã€‚ +> +> ![intel video pro analyzer details h264 bitstream](/i/intel-video-pro-analyzer.png "intel video pro analyzerがh264ビット゚トãƒĒãƒŧムをčŠŗčŋ°ã™ã‚‹") + +## おさらい + +多くぎ**įžäģŖぎã‚ŗãƒŧデックが、これぞでå­Ļんできた同じãƒĸデãƒĢをäŊŋãŖãĻいる**ことãĢ気ãĨくでしょう。原際、ビデã‚Ēã‚ŗãƒŧデックぎブロックå›ŗをãŋãĻãŋぞしょう。それはå­Ļんできた全ãĻぎ゚テップをåĢんでいぞす。少ãĒくともこぎエãƒĒã‚ĸぎį™ē明や文įŒŽãĢついãĻよりį†č§Ŗすることができるはずということです。 + +![thor_codec_block_diagram](/i/thor_codec_block_diagram.png "thor_codec_block_diagram") + +先ãĢ、[720pč§Ŗ像åēĻで30fpsで1時間ぎビデã‚Ēãƒ•ã‚Ąã‚¤ãƒĢをäŋå­˜ã™ã‚‹ãŽãĢ139GBぎ゚トãƒŦãƒŧジ](#chroma-subsampling)がåŋ…čĻãĢãĒã‚‹ã“ã¨ã‚’č¨ˆįŽ—しぞした。ここでå­Ļんだ技æŗ•ã‚’äŊŋえば、つぞり**イãƒŗã‚ŋãƒŧäēˆæ¸Ŧ、イãƒŗトナäēˆæ¸Ŧ、変åŊĸ、量子化、エãƒŗトロピãƒŧįŦĻåˇåŒ–ã€ããŽäģ–**をäŊŋえば、**ピクã‚ģãƒĢあたり0.031ビット**をäŊŋうことをæƒŗ厚しãĻ、同じįŸĨčĻšį”ģčŗĒぎビデã‚Ēをäŋå­˜ã™ã‚‹ãŽãĢ、**139GBãĢ寞しãĻ、367.82MBだけåŋ…čĻ**であることを原įžã§ããžã™ã€‚ + +> ここでäŊŋãŖた䞋ぎビデã‚Ēを元ãĢ**ピクã‚ģãƒĢあたり0.031ビット**をäŊŋうことを導きぞした。 + +## おぎようãĢH.265はH.264ã‚ˆã‚Šã‚‚č‰¯ã„åœ§į¸ŽįŽ‡ã‚’原įžã—ãĻいるぎか? + +äģŠã€ã‚ŗãƒŧデックぎäģ•įĩ„ãŋãĢついãĻよりį†č§ŖしãĻいぞす。それで、新しいã‚ŗãƒŧデックがおぎようãĢよりéĢ˜ã„č§Ŗ像åēĻをよりäŊŽã„ビットで配äŋĄã™ã‚‹ã“とができるかがį°Ąå˜ãĢį†č§Ŗできぞす。 + +AVCとHEVCを比čŧƒã—ãĻãŋぞしょう。より多くぎCPUã‚ĩイクãƒĢ(č¤‡é›‘ã•)と圧į¸ŽįŽ‡ã¯ã€ãģとんおいつでもトãƒŦãƒŧドã‚ĒフであることをåŋƒãĢæ­ĸめãĻおきぞしょう。 + +HEVCはAVCãĢ比ずãĻ、より大きく、より多くぎ**パãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ** (と **ã‚ĩブパãƒŧテã‚Ŗã‚ˇãƒ§ãƒŗ**)ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗを持ãŖãĻいぞす。そしãĻより多くぎ**イãƒŗトナäēˆæ¸Ŧ斚向**、**攚善されたエãƒŗトロピãƒŧįŦĻåˇåŒ–**やそぎäģ–を持ãŖãĻいぞす。全ãĻãŽã“ã‚Œã‚‰ãŽæ”šč‰¯ãŽãŠã‹ã’ã§ã€H.265はH.264ãĢ比ずãĻ50%äģĨ上ぎ圧į¸Žã™ã‚‹ã“とができるぎです。 + +![H.264 vs H.265](/i/avc_vs_hevc.png "h264寞h265") + +# ã‚Ēãƒŗナイãƒŗ゚トãƒĒãƒŧミãƒŗグ +## 一čˆŦįš„ãĒã‚ĸãƒŧキテクチãƒŖ + +![general architecture](/i/general_architecture.png "一čˆŦįš„ãĒã‚ĸãƒŧキテクチãƒŖ") + +[TODO] + +## プログãƒŦãƒƒã‚ˇãƒ–ãƒ€ã‚Ļãƒŗロãƒŧドとã‚ĸダプテã‚Ŗブ゚トãƒĒãƒŧミãƒŗグ + +![progressive download](/i/progressive_download.png "プログãƒŦãƒƒã‚ˇãƒ–ãƒ€ã‚Ļãƒŗロãƒŧド") + +![adaptive streaming](/i/adaptive_streaming.png "ã‚ĸダプテã‚Ŗブ゚トãƒĒãƒŧミãƒŗグ") + +[TODO] + +## ã‚ŗãƒŗテãƒŗトäŋč­ˇ + +**単į´”ãĒトãƒŧクãƒŗã‚ˇã‚šãƒ†ãƒ **をäŊŋãŖãĻã‚ŗãƒŗテãƒŗトをäŋč­ˇã™ã‚‹ã“とができぞす。トãƒŧクãƒŗを持ãŖãĻいãĒいãƒĻãƒŧã‚ļãƒŧはビデã‚ĒをãƒĒクエ゚トしようとしãĻも、CDNがįĻæ­ĸしぞす。一斚有劚ãĒトãƒŧクãƒŗを持つãƒĻãƒŧã‚ļãƒŧはそぎã‚ŗãƒŗテãƒŗトを再į”Ÿã™ã‚‹ã“とができぞす。これはたいãĻいぎã‚ĻェブčĒč¨ŧã‚ˇã‚šãƒ†ãƒ ã¨ãģとんお同じようãĢ動äŊœã—ぞす。 + +![token_protection](/i/token_protection.png "トãƒŧクãƒŗäŋč­ˇ") + +こぎトãƒŧクãƒŗã‚ˇã‚šãƒ†ãƒ ãŽå˜ä¸€ãŽãƒĻãƒŧã‚ļãƒŧは、あるãƒĻãƒŧã‚ļãƒŧãĢビデã‚Ēをダã‚ĻãƒŗロãƒŧドさせãĻ、それを配布させることもできぞす。これをéŋけるためãĢ**DRM (デジã‚ŋãƒĢ著äŊœæ¨ŠįŽĄį†)**ã‚ˇã‚šãƒ†ãƒ ã‚’äŊŋうことができぞす。 + +![drm](/i/drm.png "drm") + +原際ぎčŖŊå“ã‚ˇã‚šãƒ†ãƒ ã§ã€äēēã€…ã¯ã—ã°ã—ã°ä¸Ąæ–šãŽæŠ€čĄ“ã‚’äŊŋãŖãĻ、æ‰ŋčĒã¨čĒč¨ŧを提䞛しぞす。 + +### DRM +#### ãƒĄã‚¤ãƒŗã‚ˇã‚šãƒ†ãƒ  + +* FPS - [**FairPlay Streaming**](https://developer.apple.com/streaming/fps/) +* PR - [**PlayReady**](https://www.microsoft.com/playready/) +* WV - [**Widevine**](http://www.widevine.com/) + + +#### äŊ•? + +DRMはデジã‚ŋãƒĢ著äŊœæ¨ŠįŽĄį†ã‚’意å‘ŗしぞす。それは、䞋えばデジã‚ŋãƒĢビデã‚Ēやã‚Ēãƒŧデã‚Ŗã‚ĒãĒおぎ**デジã‚ŋãƒĢãƒĄãƒ‡ã‚Ŗã‚ĸãĢ著äŊœæ¨Šäŋč­ˇã‚’提䞛する**æ–šæŗ•ã§ã™ã€‚それは多くぎ場所でäŊŋわれãĻいぞすが、[åēƒãã¯å—けå…ĨれられãĻいぞせん](https://en.wikipedia.org/wiki/Digital_rights_management#DRM-free_works)。 + +#### ãĒぜ? + +ã‚ŗãƒŗテãƒŗトčŖŊäŊœč€…(たいãĻいぱã‚ŋジã‚Ē)は、デジã‚ŋãƒĢãƒĄãƒ‡ã‚Ŗã‚ĸぎ不æ­ŖãĒå†é…å¸ƒã‚’é˜˛ããŸã‚ãĢ、 įŸĨįš„貥į”Ŗがã‚ŗピãƒŧされることから厈りたいです。 + +#### おぎようãĢ? + +DRMぎæŠŊ蹥įš„で一čˆŦįš„ãĒåŊĸåŧã‚’、とãĻも単į´”ãĒæ–šæŗ•ã§čĒŦ明しãĻいきぞす。 + +**ã‚ŗãƒŗテãƒŗツC1** (䞋えば hlsやdashビデã‚Ē゚トãƒĒãƒŧミãƒŗグ)と**プãƒŦイヤãƒŧP1** (䞋えば shaka-clappr、exo-player、ios)が**デバイ゚D1** (䞋えば ゚マãƒŧトフりãƒŗ、テãƒŦビ、ã‚ŋブãƒŦット、デ゚クトップ/ノãƒŧトブック)上ãĢあり、**DRMã‚ˇã‚šãƒ†ãƒ DRM1** (widevine、playready、FairPlayãĒお)をäŊŋãŖãĻいるとしぞしょう。 + +The ã‚ŗãƒŗテãƒŗツC1ã¯ã€ã‚ˇã‚šãƒ†ãƒ DRM1からぎ**寞į§°éĩK1**ã§æš—åˇåŒ–ã•ã‚Œã€**æš—åˇåŒ–ã‚ŗãƒŗテãƒŗツC'1**をį”Ÿæˆã—ぞす。 + +![drm general flow](/i/drm_general_flow.jpeg "drmį”Ÿæˆãƒ•ãƒ­ãƒŧ") + +デバイ゚D1ぎプãƒŦイヤãƒŧP1はīŧ’つぎ(非寞į§°)éĩ、**į§˜å¯†éĩPRK1** (こぎéĩはäŋč­ˇã•ã‚Œ1**D1**ãĢしかįŸĨられãĻいãĒい)と**å…Ŧ開éĩPUK1**を持ãŖãĻいぞす。 + +> **1äŋč­ˇã•ã‚Œã‚‹**: こぎäŋč­ˇã¯ã€**ハãƒŧドã‚Ļェã‚ĸをäģ‹ã—ãĻ**ãĒされぞす。䞋えば、こぎéĩは、į‰šåˆĨãĒ(čĒ­ãŋ取り専į”¨)チップぎ中ãĢäŋå­˜ã•ã‚Œãžã™ã€‚ã“ã‚Œã¯ã€åžŠåˇã‚’æäž›ã™ã‚‹[ブナックボック゚](https://en.wikipedia.org/wiki/Black_box)ぎようãĢ働きぞす。もしくは(あぞり厉全でãĒい)**ã‚Ŋフトã‚Ļェã‚ĸãĢより** ãĒされぞす。DRM ã‚ˇã‚šãƒ†ãƒ ã¯ã€ä¸Žãˆã‚‰ã‚ŒãŸãƒ‡ãƒã‚¤ã‚šãŒãŠãŽã‚ŋイプぎäŋč­ˇã‚’持ãŖãĻいるかをįŸĨã‚‹æ–šæŗ•ã‚’提䞛しぞす。 + +**プãƒŦイヤãƒŧP1がã‚ŗãƒŗテãƒŗツC'1を再į”Ÿã—たい**とき、**DRMã‚ˇã‚šãƒ†ãƒ DRM1**をäŊŋうåŋ…čĻãŒã‚りぞす。å…Ŧ開éĩ**PUK1**を与えぞす。DRMã‚ˇã‚šãƒ†ãƒ DRM1は **æš—åˇåŒ–ã•ã‚ŒãŸéĩK1**をクナイã‚ĸãƒŗトぎå…Ŧ開éĩ**PUK1**と一įˇ’ãĢčŋ”しぞす。į†čĢ–上、こぎãƒŦ゚ポãƒŗ゚は.**D1ã ã‘ãŒåžŠåˇå¯čƒŊãĒ**äŊ•ã‹ã§ã™ã€‚ + +`K1P1D1 = enc(K1, PUK1)` + +**P1**は、DRMロãƒŧã‚ĢãƒĢã‚ˇã‚šãƒ†ãƒ  (それはį‰šåˆĨãĒハãƒŧドã‚Ļェã‚ĸかã‚Ŋフトã‚Ļェã‚ĸである[SOC](https://en.wikipedia.org/wiki/System_on_a_chip)もãĒりえる)をäŊŋã„ãžã™ã€‚ã“ãŽã‚ˇã‚šãƒ†ãƒ ã¯ã€į§˜å¯†éĩPRK1をäŊŋãŖãĻいるã‚ŗãƒŗテãƒŗツを**åžŠåˇã™ã‚‹ã“ã¨ãŒã§ããžã™**。**K1P1D1からぎ寞į§°éĩK1**ã‚’åžŠåˇåŒ–ã—ãĻ、**C'1を再į”Ÿ**することができぞす。最善ぎ場合では、éĩはRAMをäģ‹ã—ãĻ外ãĢさらされぞせん。 + + ``` + K1 = dec(K1P1D1, PRK1) + + P1.play(dec(C'1, K1)) + ``` + +![drm decoder flow](/i/drm_decoder_flow.jpeg "drmデã‚ŗãƒŧドフロãƒŧ") + +# jupyterぎäŊŋい斚 + +**dockerがイãƒŗ゚トãƒŧãƒĢ**されãĻいることをįĸēčĒã—ãĻ、`./s/start_jupyter.sh`ã‚’åŽŸčĄŒã—ã€ã‚ŋãƒŧミナãƒĢ上ぎ指į¤ēãĢåž“ãŖãĻください。 + +# ã‚Ģãƒŗãƒ•ã‚ĄãƒŦãƒŗã‚š + +* [DEMUXED](https://demuxed.com/) - [最垌ぎīŧ’つぎイベãƒŗトプãƒŦã‚ŧãƒŗテãƒŧã‚ˇãƒ§ãƒŗをチェック](https://www.youtube.com/channel/UCIc_DkRxo9UgUSTvWVNCmpA)することができぞす。 + +# å‚č€ƒæ–‡įŒŽ + +ここãĢ最éĢ˜ãŽã‚ŗãƒŗテãƒŗツがありぞす。こぎテキ゚トでčĻ‹ã‚‰ã‚Œã‚‹å…¨ãĻは、ここからæŠŊå‡ēされたか、元ãĢãĒãŖãĻいるか、äŊ•ã‹åŊąéŸŋを受けãĻいぞす。こぎ銚くずきãƒĒãƒŗク、æœŦ、動į”ģãĒおで、įŸĨč­˜ã‚’ã‚ˆã‚Šæˇąãã™ã‚‹ã“ã¨ãŒã§ããžã™ã€‚ + +ã‚Ēãƒŗナイãƒŗã‚ŗãƒŧ゚とチãƒĨãƒŧトãƒĒã‚ĸãƒĢ: + +* https://www.coursera.org/learn/digital/ +* https://people.xiph.org/~tterribe/pubs/lca2012/auckland/intro_to_video1.pdf +* https://xiph.org/video/vid1.shtml +* https://xiph.org/video/vid2.shtml +* http://slhck.info/ffmpeg-encoding-course +* http://www.cambridgeincolour.com/tutorials/camera-sensors.htm +* http://www.slideshare.net/vcodex/a-short-history-of-video-coding +* http://www.slideshare.net/vcodex/introduction-to-video-compression-13394338 +* https://developer.android.com/guide/topics/media/media-formats.html +* http://www.slideshare.net/MadhawaKasun/audio-compression-23398426 +* http://inst.eecs.berkeley.edu/~ee290t/sp04/lectures/02-Motion_Compensation_girod.pdf + +æœŦ: + +* https://www.amazon.com/Understanding-Compression-Data-Modern-Developers/dp/1491961538/ref=sr_1_1?s=books&ie=UTF8&qid=1486395327&sr=1-1 +* https://www.amazon.com/H-264-Advanced-Video-Compression-Standard/dp/0470516925 +* https://www.amazon.com/Practical-Guide-Video-Audio-Compression/dp/0240806301/ref=sr_1_3?s=books&ie=UTF8&qid=1486396914&sr=1-3&keywords=A+PRACTICAL+GUIDE+TO+VIDEO+AUDIO +* https://www.amazon.com/Video-Encoding-Numbers-Eliminate-Guesswork/dp/0998453005/ref=sr_1_1?s=books&ie=UTF8&qid=1486396940&sr=1-1&keywords=jan+ozer + +ビット゚トãƒĒãƒŧムäģ•æ§˜: + +* http://www.itu.int/rec/T-REC-H.264-201610-I +* http://www.itu.int/ITU-T/recommendations/rec.aspx?rec=12904&lang=en +* https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf +* http://iphome.hhi.de/wiegand/assets/pdfs/2012_12_IEEE-HEVC-Overview.pdf +* http://phenix.int-evry.fr/jct/doc_end_user/current_document.php?id=7243 +* http://gentlelogic.blogspot.com.br/2011/11/exploring-h264-part-2-h264-bitstream.html +* https://forum.doom9.org/showthread.php?t=167081 +* https://forum.doom9.org/showthread.php?t=168947 + +ã‚Ŋフトã‚Ļェã‚ĸ: + +* https://ffmpeg.org/ +* https://ffmpeg.org/ffmpeg-all.html +* https://ffmpeg.org/ffprobe.html +* https://trac.ffmpeg.org/wiki/ +* https://software.intel.com/en-us/intel-video-pro-analyzer +* https://medium.com/@mbebenita/av1-bitstream-analyzer-d25f1c27072b#.d5a89oxz8 + +非ITUã‚ŗãƒŧデック: + +* https://aomedia.googlesource.com/ +* https://github.com/webmproject/libvpx/tree/master/vp9 +* https://people.xiph.org/~xiphmont/demo/daala/demo1.shtml +* https://people.xiph.org/~jm/daala/revisiting/ +* https://www.youtube.com/watch?v=lzPaldsmJbk +* https://fosdem.org/2017/schedule/event/om_av1/ + +エãƒŗã‚ŗãƒŧドぎæĻ‚åŋĩ: + +* http://x265.org/hevc-h265/ +* http://slhck.info/video/2017/03/01/rate-control.html +* http://slhck.info/video/2017/02/24/vbr-settings.html +* http://slhck.info/video/2017/02/24/crf-guide.html +* https://arxiv.org/pdf/1702.00817v1.pdf +* https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors +* http://web.ece.ucdavis.edu/cerl/ReliableJPEG/Cung/jpeg.html +* http://www.adobe.com/devnet/adobe-media-server/articles/h264_encoding.html +* https://prezi.com/8m7thtvl4ywr/mp3-and-aac-explained/ +* https://blogs.gnome.org/rbultje/2016/12/13/overview-of-the-vp9-video-codec/ + +テ゚トį”¨ãƒ“デã‚Ēã‚ˇãƒŧã‚ąãƒŗã‚š: + +* http://bbb3d.renderfarming.net/download.html +* https://www.its.bldrdoc.gov/vqeg/video-datasets-and-organizations.aspx + +そぎäģ–: + +* http://stackoverflow.com/a/24890903 +* http://stackoverflow.com/questions/38094302/how-to-understand-header-of-h264 +* http://techblog.netflix.com/2016/08/a-large-scale-comparison-of-x264-x265.html +* http://vanseodesign.com/web-design/color-luminance/ +* http://www.biologymad.com/nervoussystem/eyenotes.htm +* http://www.compression.ru/video/codec_comparison/h264_2012/mpeg4_avc_h264_video_codecs_comparison.pdf +* http://www.csc.villanova.edu/~rschumey/csc4800/dct.html +* http://www.explainthatstuff.com/digitalcameras.html +* http://www.hkvstar.com +* http://www.hometheatersound.com/ +* http://www.lighterra.com/papers/videoencodingh264/ +* http://www.red.com/learn/red-101/video-chroma-subsampling +* http://www.slideshare.net/ManoharKuse/hevc-intra-coding +* http://www.slideshare.net/mwalendo/h264vs-hevc +* http://www.slideshare.net/rvarun7777/final-seminar-46117193 +* http://www.springer.com/cda/content/document/cda_downloaddocument/9783642147029-c1.pdf +* http://www.streamingmedia.com/Articles/Editorial/Featured-Articles/A-Progress-Report-The-Alliance-for-Open-Media-and-the-AV1-Codec-110383.aspx +* http://www.streamingmediaglobal.com/Articles/ReadArticle.aspx?ArticleID=116505&PageNum=1 +* http://yumichan.net/video-processing/video-compression/introduction-to-h264-nal-unit/ +* https://cardinalpeak.com/blog/the-h-264-sequence-parameter-set/ +* https://cardinalpeak.com/blog/worlds-smallest-h-264-encoder/ +* https://codesequoia.wordpress.com/category/video/ +* https://developer.apple.com/library/content/technotes/tn2224/_index.html +* https://en.wikibooks.org/wiki/MeGUI/x264_Settings +* https://en.wikipedia.org/wiki/Adaptive_bitrate_streaming +* https://en.wikipedia.org/wiki/AOMedia_Video_1 +* https://en.wikipedia.org/wiki/Chroma_subsampling#/media/File:Colorcomp.jpg +* https://en.wikipedia.org/wiki/Cone_cell +* https://en.wikipedia.org/wiki/File:H.264_block_diagram_with_quality_score.jpg +* https://en.wikipedia.org/wiki/Inter_frame +* https://en.wikipedia.org/wiki/Intra-frame_coding +* https://en.wikipedia.org/wiki/Photoreceptor_cell +* https://en.wikipedia.org/wiki/Pixel_aspect_ratio +* https://en.wikipedia.org/wiki/Presentation_timestamp +* https://en.wikipedia.org/wiki/Rod_cell +* https://it.wikipedia.org/wiki/File:Pixel_geometry_01_Pengo.jpg +* https://leandromoreira.com.br/2016/10/09/how-to-measure-video-quality-perception/ +* https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping +* https://softwaredevelopmentperestroika.wordpress.com/2014/02/11/image-processing-with-python-numpy-scipy-image-convolution/ +* https://tools.ietf.org/html/draft-fuldseth-netvc-thor-03 +* https://www.encoding.com/android/ +* https://www.encoding.com/http-live-streaming-hls/ +* https://web.archive.org/web/20150129171151/https://www.iem.thm.de/telekom-labor/zinke/mk/mpeg2beg/whatisit.htm +* https://www.lifewire.com/cmos-image-sensor-493271 +* https://www.linkedin.com/pulse/brief-history-video-codecs-yoav-nativ +* https://www.linkedin.com/pulse/video-streaming-methodology-reema-majumdar +* https://www.vcodex.com/h264avc-intra-precition/ +* https://www.youtube.com/watch?v=9vgtJJ2wwMA +* https://www.youtube.com/watch?v=LFXN9PiOGtY +* https://www.youtube.com/watch?v=Lto-ajuqW3w&list=PLzH6n4zXuckpKAj1_88VS-8Z6yn9zX_P6 +* https://www.youtube.com/watch?v=LWxu4rkZBLw +* https://web.stanford.edu/class/ee398a/handouts/lectures/EE398a_MotionEstimation_2012.pdf