[🇺🇞](/README.md "English") [🇚🇳](/README-cn.md "Simplified Chinese") [🇯🇵](/README-ja.md "Japanese") [🇮🇹](/README-it.md "Italian") [🇰🇷](/README-ko.md "Korean") [🇷🇺](/README-ru.md "Russian") [🇧🇷](/README-pt.md "Portuguese") [🇪🇞](/README-es.md "Spanish") [![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` コマンドは、そのプログラムが**Dockerコンテナ䞊**で実行されるこずを意味しおいたす。コンテナの䞭には、必芁な䟝存関係が党お含たれおいたす。 **ハンズオンはすべお、このレポゞトリをクロヌンしたフォルダで実行しおください**。 **jupyter examples**に぀いおは、`./s/start_jupyter.sh`でサヌバヌを起動しお、衚瀺されるURLをブラりザで開いおください。 # 倉曎履歎 * DRMシステムの远加 * 1.0.0版のリリヌス * 簡䜓字蚳の远加 * FFmpeg oscilloscopeフィルタヌの䟋を远加 # 目次 - [はじめに](#はじめに) - [目次](#目次) - [基本甚語](#基本甚語) * [カラヌ画像を笊号化する別の方法](#カラヌ画像を笊号化する別の方法) * [ハンズオン: 画像ず色の実隓](#ハンズオン-画像ず色の実隓) * [DVDの画面アスペクト比は4:3](#dvdの画面アスペクト比は43) * [ハンズオン: ビデオプロパティを調べる](#ハンズオン-ビデオプロパティを調べる) - [冗長性陀去](#冗長性陀去) * [色、明るさず私たちの目](#色、明るさず私たちの目) + [カラヌモデル](#カラヌモデル) + [YCbCrずRGB間の倉換](#ycbcrずrgb間の倉換) + [クロマサブサンプリング](#クロマサブサンプリング) + [ハンズオン: YCbCrヒストグラムを調べる](#ハンズオン-ycbcrヒストグラムを調べる) * [フレヌムの皮類](#フレヌムの皮類) + [Iフレヌム (むントラ、キヌフレヌム)](#iフレヌム-むントラ、キヌフレヌム) + [Pフレヌム (予枬)](#pフレヌム-予枬) - [ハンズオン: Iフレヌムが぀だけのビデオ](#ハンズオン-iフレヌムが぀だけのビデオ) + [Bフレヌム (双方向予枬)](#bフレヌム-双方向予枬) - [ハンズオン: Bフレヌム付きのビデオずの比范](#ハンズオン-bフレヌム付きのビデオずの比范) + [たずめ](#たずめ) * [時間的冗長性 (むンタヌ予枬)](#時間的冗長性-むンタヌ予枬) - [ハンズオン: 動きベクトルを芋る](#ハンズオン-動きベクトルを芋る) * [空間的冗長性 (むントラ予枬)](#空間的冗長性-むントラ予枬) - [ハンズオン: むントラ予枬を調べる](#ハンズオン-むントラ予枬を調べる) - [ビデオコヌデックの仕組み](#ビデオコヌデックの仕組み) * [䜕か? なぜ? どのように?](#䜕か-なぜ-どのように) * [歎史](#歎史) + [AV1の誕生](#av1の誕生) * [䞀般的コヌデック](#䞀般的コヌデック) * [ステップ - 画像分割](#ステップ---画像分割) + [ハンズオン: パヌティションを調べる](#ハンズオン-パヌティションを調べる) * [ステップ - 予枬](#ステップ---予枬) * [ステップ - 倉換](#ステップ---倉換) + [ハンズオン: 皮々の係数を捚おる](#ハンズオン-皮々の係数を捚おる) * [ステップ - 量子化](#ステップ---量子化) + [ハンズオン: 量子化](#ハンズオン-量子化) * [ステップ - ゚ントロピヌ笊号化](#ステップ---゚ントロピヌ笊号化) + [可倉長笊号](#可倉長笊号) + [算術笊号](#算術笊号) + [ハンズオン: CABAC察CAVLC](#ハンズオン-cabac察cavlc) * [ステップ - ビットストリヌムフォヌマット](#ステップ---ビットストリヌムフォヌマット) + [H.264ビットストリヌム](#h264ビットストリヌム) + [ハンズオン: H.264ビットストリヌムを調べる](#ハンズオン-h264ビットストリヌムを調べる) * [おさらい](#おさらい) * [どのようにH.265はH.264よりも良い圧瞮率を実珟しおいるのか?](#どのようにh265はh264よりも良い圧瞮率を実珟しおいるのか) - [オンラむンストリヌミング](#オンラむンストリヌミング) * [䞀般的なアヌキテクチャ](#䞀般的なアヌキテクチャ) * [プログレッシブダりンロヌドずアダプティブストリヌミング](#プログレッシブダりンロヌドずアダプティブストリヌミング) * [コンテンツ保護](#コンテンツ保護) - [jupyterの䜿い方](#jupyterの䜿い方) - [カンファレンス](#カンファレンス) - [参考文献](#参考文献) # 基本甚語 **画像**は、**二次元マトリクス**ずしお考えるこずができたす。さらに次元を増やしお**䞉次元マトリクス**にするこずで画像の色を衚珟するこずも可胜です。 画像の色を[原色 (赀、緑、青)](https://ja.wikipedia.org/wiki/%E5%8E%9F%E8%89%B2)で衚珟するず、䞉぀の平面を定矩するこずになりたす。䞀぀めが**èµ€**、二぀目が**緑**、そしお䞉぀目が**青**です。 ![an image is a 3d matrix RGB](/i/image_3d_matrix_rgb.png "画像は䞉次元マトリクスです") マトリクスのそれぞれの芁玠を**ピクセル** (画玠)ず呌びたす。䞀぀のピクセルはその色の**匷床** (通垞は数倀)を衚したす。䟋えば、**赀色のピクセル**は、緑が0、青が0、赀が最倧の匷床により衚珟できたす。**ピンク色のピクセル**も同様に3぀の倀で衚珟できたす。0から255の数倀で衚珟するこずにより、ピンクピクセルは**èµ€=255、緑=192、青=203**ず定矩できたす。 > #### カラヌ画像を笊号化する別の方法 > 色を衚珟する方法は、他にもたくさんありたす。䟋えば、RGBモデルでは各ピクセルで3バむトを必芁ずしたすが、むンデックスパレットは1バむトしか必芁ありたせん。そういったモデルでは、色を衚珟するために䞉次元モデルを䜿わずに二次元モデルを䜿甚できるでしょう。メモリを節玄できたすが、色の遞択肢を狭めるこずになりたす。 > > ![NES palette](/i/nes-color-palette.png "ファミコンパレット") 䟋えば、䞋の画像をみおください。1番巊の画像は色付けされおおり、他の画像は赀、緑、青の匷床を衚す平面です(グレヌトヌンで衚瀺しおいたす)。 ![RGB channels intensity](/i/rgb_channels_intensity.png "RGB芁玠の茝床") **赀色**が最も倚く䜿われおいるこずが分かりたす(巊から二番目の顔の最も明るい郚分)。䞀方**青色** は服の䞀郚ず**マリオの目にしかみられたせん**(最埌の顔) 。**マリオのひげ**に察しおは、**どの色もあたり䜿われおいない**(最も暗い郚分)こずが分かりたす。 各色の匷床は**ビット深床**ずよばれる䞀定量のビットで衚珟されたす。色(平面)ごずに**8ビット**(0から255の倀で衚珟する)を䜿う堎合、**24ビット**(8ビット x 3次元 R/G/B)の**色深床**を持぀こずになり、2の24乗皮類の色を䜿えるこずが掚枬できたす。 > [画像がどのように䞇物をビットずしおずらえるのか](http://www.cambridgeincolour.com/tutorials/camera-sensors.htm)を孊ぶず **良い**でしょう もう䞀぀の画像のプロパティは **解像床**です。解像床は長さあたりのピクセルの数です。解像床はよく幅 x 高さずしお衚珟されたす。䟋えば、䞋蚘は**4×4**の画像です。 ![image resolution](/i/resolution.png "画像解像床") > #### ハンズオン: 画像ず色の実隓 > [jupyter](#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 フレヌムレヌト 䟋えば、圧瞮を党く䜿わないなら、フレヌムレヌトが30で、ピクセルあたりが24ビットで、解像床が480x240のビデオは、**秒間あたり82,944,000ビット**もしくは82.944 Mbps (30x480x240x24)が必芁です。 **ビットレヌト**がほずんど䞀定なら、固定ビットレヌト(**CBR**)ず呌ばれたす。ビットレヌトが倉動するなら、可倉ビットレヌト (**VBR**)ず呌ばれたす。 > このグラフはフレヌムが真っ黒の間はあたりビットを䜿わない、制玄付きのVBRを瀺しおいたす。 > > ![constrained vbr](/i/vbr.png "制玄付きのvbr") 黎明期に、技術者たちが**垯域幅を増やさずに**ビデオ画面で認識できるフレヌムレヌトを倍にする技術を思い぀きたした。この技術は**むンタヌレヌス動画**ずしお知られおいたす。基本的には䞀぀目の「フレヌム」で画面の半分を送り、次の「フレヌム」で残りの半分を送りたす。 今日では **プログレッシブスキャン技術**を䜿っお画面に描画されたす。プログレッシブは、動画を描画、保存、転送する手段の䞀぀で、各フレヌムの党走査線を順番に描画したす。 ![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**の色は**同じ**であるこずが分からないずしおも倧䞈倫です。私たちの脳は**色よりも明暗に泚意をはらう**こずで錯芚を起こさせおいるのです。右偎では、同じ色のコネクタヌがあるため、私たち私たちの脳は、それらは実際は同じ色であるずいうこずを簡単に気づきたす。 > **私たちの目がどのように機胜するかの簡単な説明** > > [県は耇雑な噚官](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 "県の構成") > > **コントラスト感床特性 (Contrast sensitivity functions)** > > 実隓心理孊をはじめさたざたな分野の研究者が、人間の芖芚に぀いお倚くの理論を䜜り䞊げおきたした。そのひず぀が「コントラスト感床特性」です。コントラスト感床特性は光の時空間に関するものです。たず、芳察者にある光を提瀺し、光を倉化させおいきたす。この特性は、芳察者が倉化に気付いたず報告するたで、どれだけ光を倉化させる必芁があるかを瀺したす。耇数圢の `functions` ずなっおいるのは、癜黒だけでなく、カラヌでも感床を枬定できるためです。実隓結果から、倚くの堎合、人間の目は色よりも明るさに敏感だずわかりたした。 私たちは**茝床**(画像の明るさの床合い)により敏感であるこずが分かりたした。この特性を利甚したしょう。 ### カラヌモデル **RGBモデル**を䜿っお[カラヌ画像がどのように](#基本甚語)機胜するのか最初に孊びたしたが、他のモデルも存圚したす。実は、茝床(明るさ)ず色床(色)を別にするモデルが存圚したす。それは**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の領域](#冗長性陀去)が必芁になるこずを先に蚈算したした。**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カラヌヒストグラム") ### 色、茝床、明るさ、ガンマに぀いおの映像 茝床や明るさ、ガンマ、色に぀いお解説しおいる玠晎らしい動画がありたす。ぜひご芧ください。 [![Analog Luma - A history and explanation of video](http://img.youtube.com/vi/Ymt47wXUDEU/0.jpg)](http://www.youtube.com/watch?v=Ymt47wXUDEU) > ### ハンズオン: YCbCr 匷床を調べる > [FFmpegのoscilloscope filter](https://ffmpeg.org/ffmpeg-filters.html#oscilloscope)を䜿っお、映像のYの匷床を可芖化できたす。 > ```bash > ffplay -f lavfi -i 'testsrc2=size=1280x720:rate=30000/1001,format=yuv420p' -vf oscilloscope=x=0.5:y=200/720:s=1:c=1 > ``` > ![y color oscilloscope](/i/ffmpeg_oscilloscope.png "y color oscilloscope") ## フレヌムの皮類 次に**時間的な冗長性**の削枛を詊みたしょう。しかし、その前にいく぀かの基本的甚語に぀いお抌さえおおきたしょう。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぀前のフレヌムを参照し、そのフレヌムずの差分だけを甚いおフレヌム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 "珟実䞖界の動き補償") > 匕甚元: 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") ## 空間的冗長性 (むントラ予枬) ビデオの䞭の**1぀1぀のフレヌム**を分析するず、**たくさんの盞関性のある領域**が存圚するこずが分かりたす。 ![](/i/repetitions_in_space.png) 䟋を通しおみおいきたしょう。このシヌンはほずんど青ず癜で構成されおいたす。 ![](/i/smw_bg.png) これは `Iフレヌム`で、予枬のために**前のフレヌムを䜿えたせん**が、圧瞮するこずはできたす。赀いブロックを遞択しお゚ンコヌドしおみたしょう。**隣接する郚分を芋る**ず、**その呚りの色に傟向**があるこずを**掚定**するこずができたす。 ![](/i/smw_bg_block.png) このフレヌムでは**色が垂盎方向に広がり**続けるこずを**予枬**しおみたす。**未知のピクセルの色が隣接するピクセルの色を持぀**こずを意味したす。 ![](/i/smw_bg_prediction.png) **予枬が間違うかもしれたせん**。そのため、この手法(**むントラ予枬**)を適甚しおから、**実際の倀を匕いお**差分を生成する必芁がありたす。その差分は予枬前よりもさらに圧瞮しやすいマトリクスになりたす。 ![](/i/smw_residual.png) 他にも様々な予枬方法がありたす。ここで玹介した方法は、盎線状に䞊んだ領域の予枬を行い、ブロックの䞊の行のピクセルをブロック内の各行にコピヌしおいたした。ここにさらに角床成分を加え、巊隣のピクセルの倀も利甚しおブロック内のピクセル倀を予枬する方法もありたす。たた巊隣ず䞊隣のピクセル倀の平均を利甚する、DC予枬ずいう方法もありたす。 > #### ハンズオン: むントラ予枬を調べる > [ffmpegでマクロブロックずそれらの予枬付きのビデオを生成する](/encoding_pratical_examples.md#generate-debug-video)こずができたす。[それぞれのブロックの色の意味](https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors?version=7#AnalyzingMacroblockTypes)を理解するために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") # ビデオコヌデックの仕組み ## What? Why? How? **What?** デゞタルビデオを圧瞮、解凍する゜フトりェア / ハヌドりェアの郚品。**Why?** 制限された垯域ずストレヌゞの䞋でより高い品質のビデオぞの芁求が、垂堎ず瀟䌚で高たっおいるため。毎秒30フレヌム、ピクセルあたり24ビット、解像床が480x240のビデオに[必芁な垯域を蚈算](#基本甚語)したのを芚えおいたすか。圧瞮なしでは**82.944 Mbps**でした。テレビやむンタヌネットでHD/FullHD/4Kを配信するためには圧瞮するしかありたせん。**How?** ここで䞻な技法に぀いお簡単に芋おいきたす。 > **コヌデック 察 コンテナ** > > 初心者がよく誀解するこずの぀に、デゞタルビデオコヌデックず[デゞタルビデオコンテナ](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**の初版が完成したした。同じ幎に **On2 Technologies** (旧Duck Corporation)ずいう䌚瀟が、**ロむダリティヌフリヌ**で非可逆ビデオ圧瞮の **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/)はハヌドりェアメヌカヌ(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コヌデックを分析**できるこずを知っお驚くこずでしょう。https://arewecompressedyet.com/analyzer/ を芋おください。 > > ![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 "画像分割") **しかしなぜ?** たくさんの理由がありたす。䟋えば、画像を分割するず小さなパヌティションを動きのある小さな郚分に䜿い、より倧きなパヌティションを静的な背景に䜿っお、予枬をより正確に行うこずができたす。 通垞、コヌデックは、スラむス(もしくはタむル)、マクロ(もしくは笊号ツリヌナニット)やたくさんのサブパヌティションで **パヌティションを構成したす**。これらのパヌティションの最倧サむズは様々で、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") ## ステップ - 予枬 パヌティションに分割するず、それらに぀いお予枬を行うこずができたす。[むンタヌ予枬](#時間的冗長性-むンタヌ予枬)のために、**動きベクトルず差分を送信する**必芁があり、たた[むントラ予枬](#空間的冗長性-むントラ予枬)のために、**予枬方向ず差分を送信する**必芁がありたす。 ## ステップ - 倉換 差分ブロック (`予枬パヌティション - 実際のパヌティション`)を生成した埌、それを**倉換**するこずで**画質をある皋床**保ったたた、どの**ピクセルを捚おられるか**が分かるようになりたす。それにはいく぀かの倉換が存圚したす。 [他の倉換](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)を䜿おうずしおいたす。 > ### ハンズオン: CABAC察CAVLC > [぀はCABAC、もう䞀方はCAVLCを䜿っお぀のストリヌムを生成](https://github.com/leandromoreira/introduction_video_technology/blob/master/encoding_pratical_examples.md#cabac-vs-cavlc)し、生成する為にかかる**時間ず最終的なサむズを比范**しおみたしょう。 ## ステップ - ビットストリヌムフォヌマット これらのステップ党おを行った埌、**圧瞮されたフレヌムずこれらのステップたでのコンテキストを䞀぀にたずめる**必芁がありたす。 **゚ンコヌダによっおなされた決定**をデコヌダぞ明瀺的に知らせる必芁がありたす。ビット深床、色空間、解像床、予枬情報動きベクトル、むントラ予枬方向、プロファむルレベル、フレヌムレヌト、フレヌムタむプ、フレヌム数、その他倚数です。 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 (Network Abstraction Layer)](https://en.wikipedia.org/wiki/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://ghostarchive.org/archive/JBwdI) これらのフィヌルドの倀に察しおある蚈算をするず、**解像床**を埗るこずができたす。`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://ghostarchive.org/archive/JBwdI)ず呌ばれる特別なデコヌダヌを䜿っお、デコヌドする必芁がありたす。この方法は、デフォルト倀が倚いケヌスではたいおい、**倉数倀を笊号化するのにずおも効率的**です。 > このビデオの**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** ビットストリヌム](https://medium.com/@mbebenita/av1-bitstream-analyzer-d25f1c27072b#.d5a89oxz8)のビットストリヌムを探玢するこずができたす。[それらはみんな䌌おたすかいいえ](http://www.gpac-licensing.com/2016/07/12/vp9-av1-bitstream-format/)、しかし1぀を孊ぶず、他は簡単に理解できたす。 > ### ハンズオン: 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のストレヌゞ](#クロマサブサンプリング)が必芁になるこずを蚈算したした。ここで孊んだ技法぀たり**むンタヌ予枬、むントラ予枬、倉圢、量子化、゚ントロピヌ笊号化、その他**を駆䜿しお、**ピクセルあたり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/) #### What? DRMは[Digital rights management(デゞタル著䜜暩管理)](https://sander.saares.eu/categories/drm-is-not-a-black-box/)を意味したす。これは、ビデオやオヌディオなどの**デゞタルメディアに著䜜暩保護を提䟛する**方法です。倚くの堎所で䜿われおいたすが、[広くは受け入れられおいたせん](https://en.wikipedia.org/wiki/Digital_rights_management#DRM-free_works)。 #### Why? コンテンツ補䜜者(たいおいはスタゞオ)は、デゞタルメディアの䞍正な再配垃を防ぐために、 知的財産が耇補されるこずから守りたいためです。 #### How? DRMの抜象的で䞀般的な圢匏を、ずおも単玔な方法で説明しおいきたす。 **コンテンツC1** (䟋えば hlsやdashビデオストリヌミング)ず**プレむダヌP1** (䟋えば shaka-clappr、exo-player、ios)が**デバむスD1** (䟋えば スマヌトフォン、テレビ、タブレット、デスクトップ/ノヌトブック)䞊にあり、**DRMシステムDRM1** (widevine、playready、FairPlayなど)を䜿っおいるずしたしょう。 コンテンツ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は クラむアントの公開鍵**PUK1**で**暗号化された鍵K1**を返したす。理論䞊、このレスポンスは**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 * https://wiki.multimedia.cx * https://mahanstreamer.net * 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/High-Efficiency-Video-Coding-HEVC/dp/3319068946 * 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://mediaarea.net/en/MediaInfo * https://www.jongbel.com/ * 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://ghostarchive.org/archive/0W0d8 (was: 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 その他: * https://github.com/Eyevinn/streaming-onboarding * 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 * https://web.archive.org/web/20100728070421/http://www.csc.villanova.edu/~rschumey/csc4800/dct.html (was: 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 * https://sander.saares.eu/categories/drm-is-not-a-black-box/