exits

勉強記録

動画関連技術 超ざっくりまとめ (コンテナ・コーデック編)

はじめに

この記事はドワンゴ Advent Calendar 2020 の6日目の記事です。

ドワンゴ Advent Calendar への参加も4年目となりました。 今回は仕事で触れている動画関連技術について、自分の勉強の覚え書きを書いてみようと思います。
今年もハードルを下げていくぞ💪

去年までの記事はこちら

ドワンゴ Advent Calendar 2019

第2のドワンゴ Advent Calendar 2018

第2のドワンゴ Advent Calendar 2017

さて、私は仕事で何をやっているかと言うと、ざっくりと動画に関わることをやっている気がします。

動画に関わることと一口にいっても、コーデック、コンテナ、配信プロトコルなど色々ありますね。
用語も複雑で、初めて動画に関わることになった頃は何が何やらという感じでした。 数年経った今でも分からないことだらけです。
人類には複雑すぎる…

今回はコーデック・コンテナの違いと概要、配信プロトコルの概要についてまとめ直してみました。

ただしがき

前述の通り動画関連技術は広すぎるので、今回は主に自分が比較的よく触れてきた範囲の話だけします。
また、抜け漏れも多々あると思いますが、概要を述べる記事ということでご容赦ください🙏

この記事で取り上げること

  • コーデック・コンテナの違い
  • よく使われるコンテナの概要
  • よく使われる動画コーデックの概要
  • MPEG 系コーデックの変遷

この記事では扱わないこと

  • 静止画コーデック
  • 音声コーデック
  • 動画コーデックの詳細
  • MPEG 系以外のコーデック

コンテナとコーデック

f:id:yue82:20201206035213p:plain

コンテナとは

映像、音声、字幕、メタデータなどをまとめて扱うためのフォーマットです。
映像と音声を同期させたり、動画にチャプターを設定したり、多言語の字幕を扱ったりと、かなり複雑なことができます。

よく見かけるコンテナには以下のようなものがあります。

  • Flash Video (.flv)
  • MPEG-2 TS (.ts)
  • MPEG-4 Part 14 (.mp4)

コーデックとは

映像、音声など、それぞれのメディアを符号圧縮するための規格です。 また、実際に符号化・復号を行うソフトウェア自体のことも指します。 データを圧縮して、転送容量や保存容量を削減することに特化していますが、コンテナの中に格納されることがほとんど前提となっているため、コンテナで扱いやすいような工夫もされています。

映像、音声のそれぞれについて、目に触れる機会のあるコーデックは以下のようなものでしょうか。

  • 映像コーデック

    • H.264/AVC, H.265/HEVC, H.266/VVC
    • VP8, VP9, AV1
  • 音声コーデック

    • MP3
    • AAC
    • flac

コンテナ・コーデックの両方を含む規格

コンテナ・コーデックのそれぞれを詳しく見る前に、ややこしくなりそうな部分があるので先に整理します。

動画技術の規格を策定する会議体の中で、(たぶん)最も有名な組織として MPEG があります。

MPEG (Moving Picture Experts Group) の正式名称は ISO/IEC JTC 1 / SC 29 / WG 11です。
(ISO: International Organization for Standardization, IEC: International Electrotechnical Commission, JTC: Joint Technical Committee, SC: Sub Committee, WG: Working Group)
ISO(国際標準化機構) と IEC(国際電気標準会議) の2つの組織の合同技術委員会の中の、動画に関する規格を作るワーキンググループです。

この MPEG が策定した MPEG-2, MPEG-4 などの規格には、コンテナとコーデックの両方が含まれており、全体的なシステムとしての規格になっています。 説明の上でとてもややこしいため先に軽くまとめておきます。

MPEG-2

MPEG よって策定された2番目の規格です。
MPEG-2 はSystem, Video, Audio の3つに分かれています。

MPEG-2 System

MPEG-2 のコーデックを多重化、伝送するためのファイルやストリームのフォーマット(コンテナ) の規格です。
拡張されて MPEG-2 のコーデック以外も扱えるようになっています。

蓄積メディアに向いている MPEG-2 PS(Program Stream) と、放送・通信に向いている MPEG-2 TS(Transport Stream) があります。

MPEG-2 Video

映像コーデック規格です。

MPEG-2 Audio

音声コーデック規格です。

MPEG-4

MPEG によって策定された3番目の規格です。
(MPEG-3 は MPEG-2 と共通部分が多かったために MPEG-2 に吸収され、 MPEG-3 は欠番となったそうです。)

MPEG-4 は扱う内容が多すぎるため、30個の part に分かれています。
Wikipedia を見ると全ての part について概要が載っていますが、知的財産権、フォント、3Dグラフィックなど多岐にわたる内容が詰め込まれている規格であることが見て取れます。

本記事に関連する項目は part 1, 2, 3, 10, 12, 14です。

Part 1: MPEG-4 System

MPEG-4 のコーデックを多重化、伝送するためのファイルやストリームのフォーマット(コンテナ) の規格です。
拡張されて MPEG-4 のコーデック以外も扱えるようになっています。

Part 2: MPEG-4 Visual

映像コーデック規格です。

H.264/AVC より前に開発された、少し古い規格です。

Part 3: MPEG-4 Audio

音声コーデック規格です。

MPEG-4 AAC などのいくつかの規格が含まれます。

Part 10: Advanced Video Codec

映像コーデック規格です。

H.264/AVC コーデックのことです。

Part 12: ISO base media file format (bmff)

ファイルフォーマット(コンテナ)の規格です。

汎用的に作られており、 MP4 の基礎になっています。

Part 14: MP4 file format

ファイルフォーマット(コンテナ)の規格です。

bmff をベースに拡張したものです。

コンテナ

MPEG 関連の用語が整理できたところで、代表的なコンテナについて見てみます。

Flash Video (.flv)

Flash Video は、 Adobe Flash を利用して動画を保存・伝送するコンテナです。

Flash Video には FLV と F4V という2つの形式があります。
FLV は F4V よりも古い形式で、いわゆる Flash 動画のファイルである SWF と近いものです。 F4V は bmff (MPEG-4 part12) に準拠している、新しい形式です。

対応コーデック

  • 映像: VP6, H.264/AVC ..
  • 音声: MP3, AAC ..

ただし、 H.264/AVC, AAC では F4V の利用が推奨されています。

配信プロトコル

RTMP のみです。

MPEG-2 TS (.ts)

前述の MPEG-2 System のうちのTSの方です。

放送・通信などでよく使われるコンテナで、動画サイトを視聴しているときに通信状況を確認すると、たくさんの .ts ファイルをダウンロードしている様子が見られると思います。

対応コーデック

  • 映像: MPEG-1, MPEG-2 Video, MPEG-4 Visual, H.264/AVC, ..
  • 音声: MP1, MP2, MP3, AC-3, AAC, ..

配信プロトコル

指定されていません。

MPEG-4 part 14 MP4 (.mp4)

前述の MPEG-4 の part 14 です。
ファイルもストリーミングもサポートされています。

対応コーデック

  • 映像: MPEG-1, MPEG-2 Video, MPEG-4 Visual, H.264/AVC, H.265/HEVC, AV1..
  • 音声: MP1, MP2, MP3, AAC, ..

配信プロトコル

指定されていません。

映像コーデック

次に代表的な映像コーデックを見てみます。

MPEG & VCEG

映像コーデック名というと H.264/AVC をよく目にすると思いますが、これは MPEG と VCEG が合同で策定した映像コーデック規格です。

VCEG (Video Coding Experts Group) の正式名称は ITU-T SG16 / Q.6 です。 ITU-T(International Telecommunication Union Telecommunication Standardization Sector / 国際通信連合 電気通信標準化部門) の中の、映像に関する規格を作る委員会です。

MPEG では映像コーデック、音声コーデック、コンテナなどの様々な規格を策定していますが、そのうちの映像コーデック規格については近年、 VCEG と合同で策定しています。
MPEG では "AVC" 、 VCEG では "H.264" と、それぞれのグループで規格の名称が存在するため、本記事では2つの名称を合わせて H.264/AVC と表記しています。

策定された規格の一覧と特徴を簡単に載せておきます。

MPEG VCEG 概要
1990 H.261 ISDN上でのテレビ会議を想定した映像圧縮の規格
1993 MPEG-1 Video ビデオCDに動画を記録するための映像圧縮の規格
1995 MPEG-2 Video H.262 テレビ放送向けの映像圧縮の規格
1996 H.263 H.261の改良版で、訂正機能が向上した
1998 MPEG-4 Visual インターネットなどの低伝送速度に適した映像圧縮の規格
2003 MPEG-4 AVC H.264 MPEG-4 Visual, H.263 より圧縮効率が2倍向上した
2013 HEVC H.265 H.264/AVC より圧縮効率が2倍向上した
2020 VVC H.266 H.265/HEVC より圧縮効率が2倍向上した

その他の映像コーデック

様々な団体、企業が映像コーデックの開発・研究を行っており、以下の例のように、非常に多くの映像コーデックが存在します。

  • SMPTE: VC-1, VC-2, VC-3, ..
  • IETF: VP8
  • Google: VP9
  • AOMedia: AV1

これらのコーデックについても取り上げたかったのですが、普段扱っているコーデックとは異なる系列だということもあり調査時間が足りないため、今回は扱いません。 🙇

配信プロトコル

最後に、おまけ程度ではありますが、代表的な配信プロトコルについてまとめておきます。

RTMP (Real Time Messaging Protocol)

Adobe が開発しているストリーミングプロトコルです。

元は Flash のための技術であるため、RTMP のパケットと .flv ファイルはほとんど同じようなものになっています。
基本は TCP ベースですが、 UDP を使う場合もあります。

HTTP Live Streaming (HLS)

Apple が開発しているストリーミングプロトコルです。

HTTP ベースとなっており、.m3u8 マニフェストファイルと MPEG-2 TS の動画コンテナが使われます。

MPEG-DASH (Dynamic Adaptive Streaming over HTTP)

MPEG が策定したストリーミングの規格です。

コーデックに依存しないという特徴があります。 HTTPベースで、MPD(Media Presentation Description) マニフェストファイルと bmff または MPEG-2 TS の動画コンテナが用いられます。

WebRTC

HTML5で策定された、 P2P 通信でブラウザ間のリアルタイム通信を行う API の規格です。

UDP ベースとすることでリアルタイム性を担保しており、P2P マルチキャスト配信も可能になっています。

CMAF (Common Media Application Format)

Apple と Microsoft が共同で MPEG に提出し策定された、HTTP ベースのストリーミングプロトコルの形式を統一するためのフォーマットです。

共通のコンテナに対して、対応したいプロトコルのマニフェストファイルを複数用意することで、複数のプロトコルで配信することができます。
コンテナとしては bmff を用い、 特に fragmented MP4 機能を使うことで低遅延を実現しています。

おわりに

初めて動画関連技術について勉強したときに理解しにくく思った部分に気をつけながらまとめてみました。
分かっている人には当たり前の内容かもしれませんが、意外とややこしいことが多いですよね。

実はこの記事の内容は社内LTで喋ったことの書き下ろしです。
(配信プロトコルの項目は追加しました。)

今後の社内LTでは、

  • エンコーダ・デコーダが何をやっているのか
  • なぜ圧縮できるのか
  • コーデックが違うと何が違うのか
  • H.266/VVC は何が新しいのか

などについての発表する予定です!(宣言して追い込んでいく)
こちらについても、うまくまとまればブログ記事にしたいと思っています。