プロトコル
*****

プロトコルは、特定のプロトコルを使用するために必要になるリソースへのアクセスを可能にする Libav 上の構成される要素です。

Libav のビルドを構成(configure)する際は、既定ではサポートされている全てのプロトコルが有効になっています。configure オプション "--list-protocols" を使うと全ての利用可能なプロトコルがリストアップされます。

configure オプション "--disable-protocols" を使えば全てのプロトコルを無効にすることができ、 "--enable-protocol=PROTOCOL" で特定のプロトコルを選択して有効にでき、または "--disable-protocol=PROTOCOL" で特定のプロトコルを無効にできます。

ff* ツールのオプション "-protocols" はサポートされているプロトコルのリストを表示します。

現在利用可能なプロトコルの説明は以下の通りです。

concat
======

物理的な連結プロトコル。

多くのリソースから順に、1つの独自のリソースであるかのように読んだりシークしたりできます。

このプロトコルが受け取る URL は次の構文を持ちます:

     concat:URL1|URL2|...|URLN

ただし URL1、URL2、...、URLN は連結されるリソースの URL で、それぞれは異なるプロトコルを指定していてもかまいません。

例えばファイル列 split1.mpeg、split2.mpeg、split3.mpeg を avplay で読むには、次のコマンドを使ってください:

     avplay concat:split1.mpeg\|split2.mpeg\|split3.mpeg

多くのシェルで特別扱いされる文字 "|" をエスケープしなけばならないかもしれないことに注意してください。

file
====

ファイルアクセスプロトコル。

1つのファイルから、または1つのファイルに向けて読むことができます。

例えば avconv でファイル input.mpeg から読むには、次のコマンドを使ってください:

     avconv -i file:input.mpeg output.mpeg

ff* ツールは既定ではこのファイルプロトコルを使います。すなわち "FILE.mpeg" という名前で指定されたリソースは URL "file:FILE.mpeg" であるかのように解釈されます。

gopher
======

Gopher プロトコル。

hls
===

Apple HTTP Live Streaming 準拠のセグメント化ストリームを一体として読み込みます。セグメントを表す M3U8 プレイリストとしては、標準ファイルプロトコルによってアクセスされるリモートの HTTP リソースやローカルファイルになります。 hls URI スキーム名の後に "+PROTO" のように指定することで、入れ子のプロトコルを宣言します。ただし PROTO は "file" もしくは "http" です。

     hls+http://host/path/to/remote/resource.m3u8
     hls+file://path/to/local/resource.m3u8

このプロトコルの使用は控えてください - hls デミュクサーがきちんと動作するはずで(そうでなければ、不具合報告してください)、より完全です。代わりに hls デミュクサーを使うには、単に m3u8 ファイルへの URL を直接使ってください。

http
====

HTTP (ハイパーテキストトランスファープロトコル)。

mmst
====

TCP 越しの MMS (マイクロソフトメディアサーバー)プロトコル。

mmsh
====

HTTP 越しの MMS (マイクロソフトメディアサーバー)プロトコル。

要求される構文は:

     mmsh://SERVER[:PORT][/APP][/PLAYPATH]

md5
===

MD5 出力プロトコル。

書き出されるデータの MD5 ハッシュを計算し、クローズ時にそれを指示された出力もしくは(指定されていなければ)標準出力に書き出します。実際のファイルに書き出すことなく muxer をテストするために使えます。

いくつかの例を以下に挙げます。

     # エンコードされる AVI ファイルの MD5 ハッシュをファイル output.avi.md5 に書き出します。
     avconv -i input.flv -f avi -y md5:output.avi.md5

     # エンコードされる AVI ファイルの MD5 ハッシュを標準出力に書き出します。
     avconv -i input.flv -f avi -y md5:

フォーマットによっては(典型的には MOV)出力プロトコルがシーク可能である必要があり、したがって MD5 出力プロトコルが一緒だと失敗することに注意してください。

pipe
====

UNIX パイプアクセスプロトコル。

UNIX パイプに書き出したり読み込んだりすることができます。

受け取る構文は:

     pipe:[NUMBER]

NUMBER はパイプのファイル記述子に対応する番号 (例えば標準入力なら0、標準出力なら1、標準エラー出力なら2)です。 NUMBER が指定されていなければ、既定ではこのプロトコルが書き出しに用いられるときには標準出力が利用され、このプロトコルが読み込みに用いられるときには標準入力が利用されます。

例えば avconv で標準入力から読むには:

     cat test.wav | avconv -i pipe:0
     # ...これは次と同じです...
     cat test.wav | avconv -i pipe:

avconv で標準出力に書くには:

     avconv -i test.wav -f avi pipe:1 | cat > test.avi
     # ...これは次と同じです...
     avconv -i test.wav -f avi pipe: | cat > test.avi

フォーマットによっては(典型的には MOV)出力プロトコルがシーク可能である必要があり、したがってパイプ出力プロトコルが一緒だと失敗することに注意してください。

rtmp
====

リアルタイムメッセージングプロトコル。

リアルタイムメッセージングプロトコル(RTMP)は TCP/IP ネットワーク越しのマルチメディアコンテントのストリーミングに用いられます。

必要となる構文は:

     rtmp://SERVER[:PORT][/APP][/INSTANCE][/PLAYPATH]

受け取るパラメータは以下の通りです:

server
     RTMP サーバーのアドレスです。

port
     利用される TCP ポートの番号です(既定では1935です)。

app
     アクセスするアプリケーションの名前です。たいていの場合 RTMP サーバーにそのアプリケーションがインストールされているパスになります。 (例えば /ondemand/、/flash/live/、など)。URI からパースされたこの値を rtmp_app オプションを通じて上書きすることもできます。

playpath
     APP で指定されうアプリケーションから参照され再生されるリソースのパスまたは名前です。"mp4:"が先頭につくかもしれません。 URI からパースされたこの値を rtmp_playpath オプションで上書きすることもできます。

listen
     サーバーとして振舞い、やってくる接続を待ち受けます。

timeout
     やってくる接続を待ち続ける時間の最大値です。listen となります。

加えて、以下のパラメーターがコマンドラインオプション(または AVOption のコード)を通じて設定できます:

rtmp_app
     RTMP サーバーに接続するアプリケーションの名前。このオプションは URI で指定されたパラメーターを上書きします。

rtmp_buffer
     クライアントのバッファ時間をミリ秒単位で設定します。既定値は3000です。

rtmp_conn
     任意に追加する AMF 接続パラメーター。例えば B:1 S:authMe O:1 NN:code:1.23 NS:flag:ok O:0 のような文字列からパースされます。各値にはタイプを示す1文字が先頭につき、ブール値は B、数値は N、文字列は S、オブジェクトは O、null は Z であり、コロンがその後につきます。ブール値としてはデータは FALSE または TRUE を表す0か1でなければなりません。同様にオブジェクトについてはその終了または開始を表す0または1でなければなりません。サブオブジェクト内のデータ項目は名前がついている場合があり、タイプ N が先頭につけてその値の前に名前を指定します(つまり、NB:myFlag:1のように)。このオプションは任意の AMF シーケンスを構築するために複数回使えます。

rtmp_flashver
     SWF プレーヤーを実行するのに使われる Flash プラグインのバージョン。既定では LNX 9,0,124,2 です。

rtmp_flush_interval
     同じリクエストに書き出されるパケットの数(RTMPT のみ)。既定値は 10です。

rtmp_live
     メディアがライブストリームであると指定します。ライブストリームではレジュームもシークもできません。既定値は any で、これはサブスクライバーはまずプレイパスで指定されたライブストリームを再生しようとします。この名前のライブストリームが見つからなければ、録画されたストリームを再生します。その他に可能な値は live または recorded です。

rtmp_pageurl
     メディアが埋め込まれているウェブページの URL です。既定ではいかなる値も送信されません。

rtmp_playpath
     再生もしくは公開するためのストリーム識別子です。このオプションは URI で指定されたパラメーターを上書きします。

rtmp_subscribe
     サブスクライブするライブストリームの名前です。既定では何の値も送信されません。このオプションが指定されたとき、もしくは rtmp_live が live に設定されたときのみ送信されます。

rtmp_swfhash
     圧縮の展開された SWF ファイルの SHA256(32バイト)。

rtmp_swfsize
     圧縮の展開された SWF ファイルのサイズ、SWFVerification のために必要です。

rtmp_swfurl
     メディアのための SWF プレーヤーの URL です。既定では何の値も送信されません。

rtmp_swfverify
     プレーヤーの swf ファイルへの URL、ハッシュおよびサイズは自動的に計算します。

rtmp_tcurl
     ターゲットのストリームの URL です。既定値は proto://host[:port]/app です。

例えば avplay で RTMP サーバー "myserver" からアプリケーション "vod" で "sample" という名前のマルチメディアリソースを読むには:

     avplay rtmp://myserver/vod/sample

rtmpe
=====

暗号化された Real-Time Messaging Protocol です。

暗号化された Real-Time Messaging Protocol (RTMPE)は、Diffie-Hellman 鍵交換および HMACSHA256 からなる、RC4 鍵のペアを生成する標準の暗号基盤の範囲内でマルチメディアコンテントをストリーミングするために用いられます。

rtmps
=====

安全な SSL 接続経由の Real-Time Messaging Protocol です。

Real-Time Messaging Protocol (RTMPS) は暗号化された接続を通してマルチメディアコンテントをストリーミングするために用いられます。

rtmpt
=====

HTTP 経由のトンネル Real-Time Messaging Protocol です。

HTTP 経由のトンネル Real-Time Messaging Protocol (RTMPT)は、ファイアウォールを迂回するように HTTP リクエストの範囲でマルチメディアコンテントをストリーミングするためのものです。

rtmpte
======

HTTP 経由でトンネリングされた暗号化 Real-Time Messaging Protocol です。

HTTP 経由でトンネリングされた暗号化 Real-Time Messaging Protocol (RTMPTE) はファイアウォールを迂回するよう HTTP リクエストの範囲内でマルチメディアコンテントをストリーミングするために用いられます。

rtmpts
======

HTTPS 経由でトンネリングされた Real-Time Messaging Protocol です。

HTTPS 経由でトンネリングされた Real-Time Messaging Protocol (RTMPTS) はファイアウォールを迂回するように HTTPS の範囲でマルチメディアコンテントをストリーミングするためのものです。

rtmp、rtmpe、rtmps、rtmpt、rtmpte
=============================

librtmp を通じてサポートされるリアルタイムメッセージングプロトコルとそのバリエーションです。

構成(configure)の際に librtmp のヘッダとライブラリが存在しなければなりません。 "--enable-librtmp" で明示的にビルドを configure する必要があります。有効にされるとネイティブの RTMP プロトコルは置き替えられます。

このプロトコルは、RTMP、HTTP トンネルによる RTMP (RTMPT)、暗号化 RTMP (RTMPE)、SSL/TLS オーバー RTMP (RTMPS)、そしてこれら暗号化タイプのトンネル版(RTMPTE、RTMPTS)をサポートするために必要ななるほとんどのクライアント機能と少数のサーバー機能を提供します。

必要となる構文は:

     RTMP_PROTO://SERVER[:PORT][/APP][/PLAYPATH] OPTIONS

ただし RTMP_PROTO は各 RTMP バリエーションに対応する文字列 "rtmp"、"rtmpt"、"rtmpe"、"rtmps"、"rtmpte"、"rtmpts" の1つで、 SERVER、PORT、APP および PLAYPATH は RTMP ネイティブプロトコルで指定されるものと同じ意味を持ちます。 OPTIONS は空白で区切られた KEY=VAL の形のオプションのリストを含みます。

さらなる情報については librtmp のマニュアルページ(man 3 librtmp)を見てください。

例えば、avconv を使ってリアルタイムに RTMP サーバーに向けてファイルをストリームするには:

     avconv -re -i myfile -f flv rtmp://myserver/live/mystream

avplay を使って同じストリーミングを行なうには:

     avplay "rtmp://myserver/live/mystream live=1"

rtp
===

リアルタイムプロトコル。

rtsp
====

RTSP は技術的には libavformat でのプロトコルハンドラではなく、demuxer でありかつ muxer です。この demuxer は通常の RTSP (RTP 越しにデータが転送される; これは例えば Apple や Microsoft で用いられています)も Real-RTSP (RDT 越しにデータが転送される)もどちらにも対応しています。

muxer はストリームを RTSP ANNOUNCE を用いて、それに対応しているサーバー (現時点では Darwin Streaming Server と Mischa Spiegelmock の RTSP server (http://github.com/revmischa/rtsp-server)) に向けて送信するために利用できます。

RTSP のために必要となる構文は:

     rtsp://HOSTNAME[:PORT]/PATH

以下のオプションが(avconv/avplay のコマンドライン上で、あるいは AVOption または avformat_open_input のコード内で設定するのに) サポートされています:

rtsp_transport のためのフラグ:

udp
     下位トランスポートプロトコルに UDP を使います。

tcp
     下位トランスポートプロトコルに(RTSP コントロールチャンネル内で交互にした) TCP を使います。

udp_multicast
     下位トランスポートプロトコルに UDP マルチキャストを使います。

http
     下位トランスポートプロトコルに http トンネリングを使います。これは受動的なプロキシに対して便利です。

複数の下位トランスポートプロトコルを指定することが許されており、その場合一度に1つだけ試されます(1つの設定に失敗したら、次のものが試されます)。 muxer については、tcp と udp のみがサポートされています。

rtsp_flags のフラグ:

filter_src
     ネゴシエーションしたピアのアドレスとポートのみからパケットを受け取ります。

listen
     サーバーとして動作し、やってくる接続を待ち受けます。

UDP 越しにデータを受け取る際に、demuxer は受け取ったパケットを並べ直そうとします(これらが順番になっていない、もしくは全体的にパケットが失われているかもしれないからです)。AVFormatContext の max_delay フィールドで最大の遅延を0に設定することで、これを無効にできます。

avplay でマルチビットレート Real-RTSP ストリームを観る際、表示するストリームとして -vst N および -ast N で映像と音声それぞれを選択できます。そして作動中に v や a を押すことで切り替えることが可能です。

コマンドラインの例:

UDP 越しのストリームを観る、並べ直しの最大遅延は0.5秒:

     avplay -max_delay 500000 -rtsp_transport udp rtsp://server/video.mp4

HTTP トンネル経由のストリームを観る:

     avplay -rtsp_transport http rtsp://server/video.mp4

他人に観せるために、RTSP サーバーにストリームをリアルタイムで送信する:

     avconv -re -i INPUT -f rtsp -muxdelay 0.1 rtsp://server/live.sdp

リアルタイムでストリームを受け取るには:

     avconv -rtsp_flags listen -i rtsp://ownaddress/live.sdp OUTPUT

sap
===

セッションアナウンスメントプロトコル(RFC 2974)。これは技術的には libavformat のプロトコルハンドラではなく、muxer および demuxer です。分離されたポート上で定期的にストリームに対して SDP を通知することによって、 RTP ストリームのシグナリングのために使用されます。

Muxer
-----

muxer に渡される SAP url のための構文は次の通りです:

     sap://DESTINATION[:PORT][?OPTIONS]

RTP パケットはポート PORT の DESTINATION に対して送信され、ポートが指定されていない場合にはポート 5004 に対して送信されます。 OPTIONS は & で区切られたリストです。以下のオプションをサポートしています:

announce_addr=ADDRESS
     通知を送りつける送信先の IP アドレスを指定する。省略されていれば、通知は共通して利用されている SAP アナウンスメントマルチキャストアドレス 224.2.127.254 (sap.mcast.net)に、もしくは DESTINATION が IPv6 アドレスならば ff0e::2:7ffe に送信される。

announce_port=PORT
     通知を送りつけるポートを指定する、指定されなければ既定で 9875。

ttl=TTL
     通知と RTP パケットのための time to live 値を指定する、既定では 255。

same_port=0|1
     1が設定されれば、全ての RTP ストリームを同じポート対で送る。0(既定) ならば、全てのストリームは独自のポートに送られ、各ストリームは先のものより 2つ数字の大きいポート番号になる。 VLC/Live555 では、ストリームを受け取れるように、これを1に設定することが求められる。 libavformat で受信するための RTP スタックは各ストリームが一意なポートで送られる必要がある。

コマンドラインの例は以下の通り。

VLC で観るために、ローカルサブネットにストリームをブロードキャストするためには:

     avconv -re -i INPUT -f sap sap://224.0.0.255?same_port=1

同様に、avplay で観るには:

     avconv -re -i INPUT -f sap sap://224.0.0.255

そして IPv6 越しに avplay で観るには:

     avconv -re -i INPUT -f sap sap://[ff0e::1:2:3:4]

Demuxer
-------

demuxer に与える SAP url のための構文は:

     sap://[ADDRESS][:PORT]

ADDRESS は通知のために待ち受けるマルチキャストアドレスであり、省略されれば、既定の 224.2.127.254 (sap.mcast.net)が用いられる。 PORT は待ち受けるポートであり、省略された場合9875である。

demuxer は与えられたアドレスとポートで通知を待ち受ける。いったん通知を受け取るとすぐに、特定のストリームを受信しようとする。

コマンドラインの例は以下の通り。

通常の SAP マルチキャストアドレスで通知される最初のストリームを再生するには:

     avplay sap://

既定の IPv6 SAP マルチキャストアドレスで通知される最初のストリームを再生するには:

     avplay sap://[ff0e::2:7ffe]

tcp
===

トランスミッションコントロールプロトコル。

TCP url のために要求される構文は以下のとおり:

     tcp://HOSTNAME:PORT[?OPTIONS]

listen
     外から入ってくる接続を待ち受ける

          avconv -i INPUT -f FORMAT tcp://HOSTNAME:PORT?listen
          avplay tcp://HOSTNAME:PORT

udp
===

ユーザーデータグラムプロトコル。

UDP url に要する構文は:

     udp://HOSTNAME:PORT[?OPTIONS]

OPTIONS は & で区切られた KEY=VAL の形のオプションのリストを含む。サポートされているオプションのリストは以下の通り:

buffer_size=SIZE
     UDP バッファサイズをバイト数で設定する

localport=PORT
     バインドするローカル UDP ポートを上書きする

localaddr=ADDR
     ローカル IP アドレスを選択する。これは例えばマルチキャストを送信しホストが複数のインターフェイスを持つときに、どの IP アドレスのインターフェイスに送るか選択する際に便利です。

pkt_size=SIZE
     UDP パケットのバイトサイズを設定する

reuse=1|0
     UDP ソケットの再利用を明示的に有効または無効にする

ttl=TTL
     time to live 値を設定する(マルチキャストについてのみ)

connect=1|0
     UDP ソケットを connect() で初期化する。この場合、送り先アドレスは後から ff_udp_set_remote_url で変えることができない。送り先のアドレスが開始時に分からない場合、このオプションを ff_udp_set_remote_url で指定することもできる。これによって getsockname でパケットの送り元アドレスを見つけることができ、書き出しの際 "destination unreachable" を受け取った場合には AVERROR(ECONNREFUSED) を返す。受信にlについては、これによって指定されているピアのアドレス/ポートからのパケットのみを受け取るという効用がある。

sources=ADDRESS[,ADDRESS]
     指定された送信者 IP アドレスの1つからマルチキャストグループへ送られたパケットのみ受信する。

block=ADDRESS[,ADDRESS]
     指定された送信者 IP アドレスの1つからマルチキャストグループへ送られたパケットを無視する。

udp プロトコルの avconv での利用例は以下の通り。

UDP 越しにリモートエンドポイントへストリームするには:

     avconv -i INPUT -f FORMAT udp://HOSTNAME:PORT

188 サイズの UDP パケットを使い、大きい入力バッファで UDP 越しに mpegts 形式でストリームするには:

     avconv -i INPUT -f mpegts udp://HOSTNAME:PORT?pkt_size=188&buffer_size=65535

UDP 越しにリモートエンドポイントから受け取るには:

     avconv -i udp://[MULTICAST-ADDRESS]:PORT