ライブストリーミ
ングの基礎知識
その2
あれくま
おさらい
前回のおさらい
 • ビデオフォーマットの話
 • ストリーミングプロトコルの話




                    2
ビデオフォーマット
コーデック
 • 圧縮方法
 • WMV9・H.264・VP6・VP8・Theoraなどなど
 • WMA・AAC・MP3・Vorbisなどなど
コンテナ
 • ファイル構造
 • ASF・MP4・FLV・Ogg・MKVなどなど




                                   3
プロトコル
HTTPプログレッシブダウンロード
 • ダウンロードしたところまで再生
 • 簡単だけど
 • 機能少なめ
ストリーミング用プロトコル
 •   RTP・RTSP
 •   MMS・MMSH
 •   RTMP・RTMPH・RTMFP
 •   HTTP Live Streaming
 •   PCP




                           4
FLV解説編
どうしてこうなった
FLVとは
• Flashで使われるコンテナフォーマット
• シンプルでストリーミングもしやすい
• 仕様書は http://www.adobe.com/devnet/f4v.html
    • F4Vの仕様書だけど後ろの方におまけでFLVも書いてある
• RTMPでストリーミングするときのパケットと(ほぼ)同じ




                                              6
ファイルフォーマット
サイズ 9       4   11+   4     ... 11+   4
内容   ファイル   0   FLVタグ 前のタグ ... FLVタグ 前のタグ
     ヘッダ              のサイズ           のサイズ


• 全体的にビッグエンディアン
• 1つのFLVタグに映像・音声・メタデータのいずれかが入る
• 基本的にFLVタグが並んでるだけなので簡単




                                            7
ファイルヘッダ領域
 バイト位置 1     2     3   4        5     6 7   8   9
 内容      'F' 'L'   'V' バージョン    タイプフラグ データ開始位置
                       (0x01)          (0x09)

ファイル先頭にあるファイルヘッダ
タイプフラグで映像・音声が入っているかどうかを判別
 • 音声が入ってたら下から3ビット目が1 (0x04)
 • 映像が入ってたら下から1ビット目が1 (0x01)
 • 映像・音声は各1ストリームずつだけ入れられる
      • 副音声とかはできない




                                                    8
FLVタグ
位置 1      2 3 4 5      6   7   8         9   10   11   ...
内容 データ    データ   タイムスタンプ        タイムスタンプ   ストリームID       データ
   種別     サイズ                  拡張分       (0)

実際のデータが入る単位
データ種別によって内容がかわる
 • 音声 = 0x08
 • 映像 = 0x09
 • スクリプト = 0x12 = 18
タイムスタンプ
 • ファイル先頭からのミリ秒単位のタイムスタンプ
 • 24ビットで溢れたら拡張分のところに上位8ビットが入る




                                                             9
音声データ
    位置     1        ...                 ...
    内容     フォーマット情報 (追加フォーマット情報)        実データ

フォーマット情報                           #          コーデック
 • コーデック番号・サンプリング周波数・ビット数・         0          PCM(BE)
   チャンネル数なんかが入ってる                  1          ADPCM
    • さらに詳しくは仕様書参照                 2          MP3
 • コーデック番号は右表の感じ                   3          PCM(LE)
AACのみ追加フォーマット情報がつく                 4          Asao 16kHz mono
実データの内容はswfの仕様書が詳しい                5          Asao 8kHz mono
                                   6          Asao
                                   10         AAC
                                   11         Speex




                                                                10
映像データ
    位置     1        ...                ...
    内容     フォーマット情報 (追加フォーマット情報)       実データ

音声とだいたい同じ                          #         コーデック
フォーマット情報                           2         Sorenson H.263

 • コーデックIDの他にフレーム情報も入ってる           3         Screen video
    • キーフレームだとか中間フレームだとか           4         On2 VP6
 • 使えるコーデックは右表の感じ                  5         VP6+αチャンネル
実データの内容はやっぱりswfの仕様書が詳しい            6         Screen video 2
                                   7         AVC (H.264)
 • Screen videoコーデックの内容もそこに




                                                              11
スクリプトデータ
     位置 1           ...
     内容 メソッド名(文字列) 引数(配列かオブジェクト)

FLVの特徴的なところ
ActionScriptのメソッド呼び出しデータが入る
 • ビデオにプレイヤー固有のデータを埋め込める
各文字列やオブジェクトデータはAMF0で格納される
 • FLVの仕様書に全部書いてあるので気にしなくてよい
タイトル・作者・ビットレート等のメタデータもスクリプトタグで入る
 • メソッド名 = onMetaData
 • 引数 = ECMAArray(プロパティの配列)
その他プレイヤーに固有の命令も埋め込める(はず)




                                   12
FLVとストリーミング
ストリーミングしやすいフォーマット
階層のないベタ書き
 • 前もってデータ長がわからなくても書き出せる
 • どんどんファイルが伸ばせるのでライブストリーミングも可能
タグ単位で独立している
 • 一部のデータが壊れても途中から問題なく再生できる
 • ファイルヘッダは必要だけど小さい
同期が取りやすい
 • 途中でデータ落ちや化けが発生しても次のタグを探すのが楽
 • 定期的にタグヘッダが出現する
 • タグのあとにはタグのサイズがくる




                                  13
おまけ
PEERCASTで
配信するには?
ここからが本題
FLV配信は難しい
PeerCastStationでは対応
 • 1.2.0現在、メタデータは取れてない
     • これ書いてるうちに対応させた
 • 視聴側
     • PeerCastStation
     • パッチ当てたPeerCastIM
 • YP上ではUNKNOWN扱いになる
     • パッチ当てたPeerCast使ったYPならFLV
配信側はなんとかなるけど視聴側も対応必要なのはむずかしい




                                  15
FLV配信は難しい その2
エンコーダ・ストリーミングサーバの問題
× Flash Media Live Encoder
 • ストリーミングはFlash Media ServerへのPushのみ
 • FLVはファイルへの保存のみ
△ ffserver
 • 設定が難しい
 • Windowsではバイナリがない
△ VLC
 • H.264使えばいけそうだが重すぎる
△ ffmpeg + 独自ストリーミングサーバ
  • 設定さえできれば使えそう
  • GUI作るのがめんどい




                                        16
FLV配信は難しい その3
プレイヤーの問題
Windows Media Playerなどでは標準で再生できない
  • ffdshow的な別なコーデックパックが必要
  • 入れてもらえるか?
Flashベースのプレイヤー
  • PeerCastのHTML内に設置しないと見れない
  • すごいめんどい
AIRベースのプレイヤー
 • あれば見れると思う
 • あればな
 • やっぱりインストールの問題はある




                                    17
FLV配信の利点
何かいいことあるのか?
H.264が使える
  • x264は品質重視のようで重すぎる
  • HWエンコーダを使いたい
VP6が使える
  • ffmpegで使った感じでは綺麗でも軽くもない……
Flash Screen Video 2が使える
 • プログラミング配信にいい感じ
スクリプトタグが使える
  • プレイヤー・エンコーダが一括で作れれば面白いことができそう
RTMPからの変換が簡単




                                    18
RTMP→FLVサーバ
RTMPストリーミングからFLVへの変換が比較的簡単
  • RTMPのメッセージとFLVタグの構造がほぼ同じ
  • Muxがとても簡単
RTMPで受信→FLVで配信するストリーミングサーバが作れそう
 • Flashから配信とかできる
 • 市販のUstreamとかに配信できるエンコーダ・カメラ等が使えるか
   も




                                       19
まとめ
FLVの構造は簡単
PeerCastでの配信は難しいが……
 • RTMP→FLVサーバがあると夢が広がる
みんなで作ろう!




                          20
参考文献
FLV and F4V File Format Specification (Version 10.1)
 • http://www.adobe.com/devnet/f4v.html
SWF File Format Specification (version 19)
  • http://www.adobe.com/devnet/swf.html
Real-Time Messaging Protocol (RTMP) specification
  • http://www.adobe.com/devnet/rtmp.html




                                                       21

ライブストリーミングの基礎知識その2

  • 1.
  • 2.
    おさらい 前回のおさらい • ビデオフォーマットの話 • ストリーミングプロトコルの話 2
  • 3.
    ビデオフォーマット コーデック • 圧縮方法 • WMV9・H.264・VP6・VP8・Theoraなどなど • WMA・AAC・MP3・Vorbisなどなど コンテナ • ファイル構造 • ASF・MP4・FLV・Ogg・MKVなどなど 3
  • 4.
    プロトコル HTTPプログレッシブダウンロード • ダウンロードしたところまで再生 • 簡単だけど • 機能少なめ ストリーミング用プロトコル • RTP・RTSP • MMS・MMSH • RTMP・RTMPH・RTMFP • HTTP Live Streaming • PCP 4
  • 5.
  • 6.
    FLVとは • Flashで使われるコンテナフォーマット • シンプルでストリーミングもしやすい •仕様書は http://www.adobe.com/devnet/f4v.html • F4Vの仕様書だけど後ろの方におまけでFLVも書いてある • RTMPでストリーミングするときのパケットと(ほぼ)同じ 6
  • 7.
    ファイルフォーマット サイズ 9 4 11+ 4 ... 11+ 4 内容 ファイル 0 FLVタグ 前のタグ ... FLVタグ 前のタグ ヘッダ のサイズ のサイズ • 全体的にビッグエンディアン • 1つのFLVタグに映像・音声・メタデータのいずれかが入る • 基本的にFLVタグが並んでるだけなので簡単 7
  • 8.
    ファイルヘッダ領域 バイト位置 1 2 3 4 5 6 7 8 9 内容 'F' 'L' 'V' バージョン タイプフラグ データ開始位置 (0x01) (0x09) ファイル先頭にあるファイルヘッダ タイプフラグで映像・音声が入っているかどうかを判別 • 音声が入ってたら下から3ビット目が1 (0x04) • 映像が入ってたら下から1ビット目が1 (0x01) • 映像・音声は各1ストリームずつだけ入れられる • 副音声とかはできない 8
  • 9.
    FLVタグ 位置 1 2 3 4 5 6 7 8 9 10 11 ... 内容 データ データ タイムスタンプ タイムスタンプ ストリームID データ 種別 サイズ 拡張分 (0) 実際のデータが入る単位 データ種別によって内容がかわる • 音声 = 0x08 • 映像 = 0x09 • スクリプト = 0x12 = 18 タイムスタンプ • ファイル先頭からのミリ秒単位のタイムスタンプ • 24ビットで溢れたら拡張分のところに上位8ビットが入る 9
  • 10.
    音声データ 位置 1 ... ... 内容 フォーマット情報 (追加フォーマット情報) 実データ フォーマット情報 # コーデック • コーデック番号・サンプリング周波数・ビット数・ 0 PCM(BE) チャンネル数なんかが入ってる 1 ADPCM • さらに詳しくは仕様書参照 2 MP3 • コーデック番号は右表の感じ 3 PCM(LE) AACのみ追加フォーマット情報がつく 4 Asao 16kHz mono 実データの内容はswfの仕様書が詳しい 5 Asao 8kHz mono 6 Asao 10 AAC 11 Speex 10
  • 11.
    映像データ 位置 1 ... ... 内容 フォーマット情報 (追加フォーマット情報) 実データ 音声とだいたい同じ # コーデック フォーマット情報 2 Sorenson H.263 • コーデックIDの他にフレーム情報も入ってる 3 Screen video • キーフレームだとか中間フレームだとか 4 On2 VP6 • 使えるコーデックは右表の感じ 5 VP6+αチャンネル 実データの内容はやっぱりswfの仕様書が詳しい 6 Screen video 2 7 AVC (H.264) • Screen videoコーデックの内容もそこに 11
  • 12.
    スクリプトデータ 位置 1 ... 内容 メソッド名(文字列) 引数(配列かオブジェクト) FLVの特徴的なところ ActionScriptのメソッド呼び出しデータが入る • ビデオにプレイヤー固有のデータを埋め込める 各文字列やオブジェクトデータはAMF0で格納される • FLVの仕様書に全部書いてあるので気にしなくてよい タイトル・作者・ビットレート等のメタデータもスクリプトタグで入る • メソッド名 = onMetaData • 引数 = ECMAArray(プロパティの配列) その他プレイヤーに固有の命令も埋め込める(はず) 12
  • 13.
    FLVとストリーミング ストリーミングしやすいフォーマット 階層のないベタ書き • 前もってデータ長がわからなくても書き出せる • どんどんファイルが伸ばせるのでライブストリーミングも可能 タグ単位で独立している • 一部のデータが壊れても途中から問題なく再生できる • ファイルヘッダは必要だけど小さい 同期が取りやすい • 途中でデータ落ちや化けが発生しても次のタグを探すのが楽 • 定期的にタグヘッダが出現する • タグのあとにはタグのサイズがくる 13
  • 14.
  • 15.
    FLV配信は難しい PeerCastStationでは対応 • 1.2.0現在、メタデータは取れてない • これ書いてるうちに対応させた • 視聴側 • PeerCastStation • パッチ当てたPeerCastIM • YP上ではUNKNOWN扱いになる • パッチ当てたPeerCast使ったYPならFLV 配信側はなんとかなるけど視聴側も対応必要なのはむずかしい 15
  • 16.
    FLV配信は難しい その2 エンコーダ・ストリーミングサーバの問題 × FlashMedia Live Encoder • ストリーミングはFlash Media ServerへのPushのみ • FLVはファイルへの保存のみ △ ffserver • 設定が難しい • Windowsではバイナリがない △ VLC • H.264使えばいけそうだが重すぎる △ ffmpeg + 独自ストリーミングサーバ • 設定さえできれば使えそう • GUI作るのがめんどい 16
  • 17.
    FLV配信は難しい その3 プレイヤーの問題 Windows MediaPlayerなどでは標準で再生できない • ffdshow的な別なコーデックパックが必要 • 入れてもらえるか? Flashベースのプレイヤー • PeerCastのHTML内に設置しないと見れない • すごいめんどい AIRベースのプレイヤー • あれば見れると思う • あればな • やっぱりインストールの問題はある 17
  • 18.
    FLV配信の利点 何かいいことあるのか? H.264が使える •x264は品質重視のようで重すぎる • HWエンコーダを使いたい VP6が使える • ffmpegで使った感じでは綺麗でも軽くもない…… Flash Screen Video 2が使える • プログラミング配信にいい感じ スクリプトタグが使える • プレイヤー・エンコーダが一括で作れれば面白いことができそう RTMPからの変換が簡単 18
  • 19.
    RTMP→FLVサーバ RTMPストリーミングからFLVへの変換が比較的簡単 •RTMPのメッセージとFLVタグの構造がほぼ同じ • Muxがとても簡単 RTMPで受信→FLVで配信するストリーミングサーバが作れそう • Flashから配信とかできる • 市販のUstreamとかに配信できるエンコーダ・カメラ等が使えるか も 19
  • 20.
  • 21.
    参考文献 FLV and F4VFile Format Specification (Version 10.1) • http://www.adobe.com/devnet/f4v.html SWF File Format Specification (version 19) • http://www.adobe.com/devnet/swf.html Real-Time Messaging Protocol (RTMP) specification • http://www.adobe.com/devnet/rtmp.html 21