1 プロトコル

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

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

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

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

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

1.1 concat

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

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

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

concat:URL1|URL2|...|URLN

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

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

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

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

1.2 file

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

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

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

avconv -i file:input.mpeg output.mpeg

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

1.3 gopher

Gopher プロトコル。

1.4 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 を 直接使ってください。

1.5 http

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

1.6 mmst

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

1.7 mmsh

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

要求される構文は:

mmsh://server[:port][/app][/playpath]

1.8 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 出力プロトコルが一緒だと失敗することに注意してください。

1.9 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)出力プロトコルがシーク可能である必要が あり、したがってパイプ出力プロトコルが一緒だと失敗することに注意してください。

1.10 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

1.11 rtmpe

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

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

1.12 rtmps

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

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

1.13 rtmpt

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

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

1.14 rtmpte

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

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

1.15 rtmpts

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

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

1.16 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つで、 serverportapp および 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"

1.17 rtp

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

1.18 rtsp

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

muxer はストリームを RTSP ANNOUNCE を用いて、それに対応しているサーバー (現時点では Darwin Streaming Server と Mischa Spiegelmock の 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 については、tcpudp のみがサポートされています。

rtsp_flags のフラグ:

filter_src

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

listen

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

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

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

コマンドラインの例:

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

1.19 sap

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

1.19.1 Muxer

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

sap://destination[:port][?options]

RTP パケットはポート portdestination に対して送信され、 ポートが指定されていない場合にはポート 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]

1.19.2 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]

1.20 tcp

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

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

tcp://hostname:port[?options]
listen

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

avconv -i input -f format tcp://hostname:port?listen
avplay tcp://hostname:port

1.21 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