avserver Documentation


Table of Contents


1 概要

一般的な構文は次のとおりです:

avserver [options]

2 説明

警告: avserver はメンテナンスされておらず、大部分は壊れており完全な書き換えが 必要です。おそらくうまく機能しないでしょう。 自己責任で使ってください。

avserver はオーディオとビデオの両方に対応したストリーミングサーバです。 複数のライブフィード、ファイルからのストリーミング、およびライブフィードの 時間移動(avserver.conf で十分に大きいフィード領域を設定すれば、 各ライブフィードでの過去の位置をシークできます)をサポートしています。

avserver は既定では daemon モードで動作します; つまり、debug モードで 起動される、ないし NoDaemon オプションが設定ファイルで指定されない限りは、 自身をバックグラウンドに置き、TTY からデタッチします。

このドキュメントは avserver / avconv のストリーミングの側面のみを取り 扱っています。ffmpeg のパラメーターについての質問やコーデックの質問など 全て、ここでは扱いません。さらなる情報には ‘avconv.html’ を 読んでください。

2.1 どのように動作するの?

avserver は事前に記録されたファイルまたは avconv のインスタンスからの FFM ストリームを 入力として受け付け、そしてそれらを RTP/RTSP/HTTP を通じてストリームします。

avserver のインスタンスは設定ファイルで指定されたポートを listen します。 1つまたはそれ以上の avconv のインスタンスを起動でき、1つまたはそれ以上の FFM ストリームを avserver がそれらを受け取ることになっているポートへ送ることができます。 あるいは、avserver にそういった avconv インスタンスをスタートアップ時に 起動させることもできます。

入力ストリームはフィードと呼ばれ、その1つ1つは設定ファイルの中の単一の <Feed> セクションによって指定されます。

各フィードについて、さまざなまフォーマットの異なる出力ストームを持つことができ、 その1つ1つは設定ファイルの中の単一の <Stream> セクションによって指定されます。

2.2 状態ストリーム

avserver はサーバの現在の状態を表示する HTTP インターフェースを備えています。

設定ファイルで指定された特別な状態ストリームのアドレスをブラウザで単に指示してください。

例えば

<Stream status.html>
Format status

# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>

となっている場合、特別なストリーム ‘status.html’ を要求すれば サーバは状態の情報を含むページを投げてくるでしょう。

2.3 これは何ができるの?

適切に構成され動作する場合には、リアルタイムで適当なキャプチャーカードから ビデオとオーディオをキャプチャーすることができ、それをインターネット経由で (いくらかの制限がありますが)Windows Media Player や RealAudio Player に向けて ストリームすることができます。

またファイルからストリームすることもできますが、現時点では壊れています。 非常に頻繁に、Web サーバは同様にファイルを供給するために利用できます。

.ffm ファイルから記録される前のビデオをストリームすることができますが、 正しく動作させるようとするといくらかトリッキーになります。

2.4 しなければならないことは?

私は 900 MHz Duron 上の Linux を cheapo Bt848 ベースの TV キャプチャーカード とともに使っています。平凡な Linux 2.4.17 を平凡なドライバーとともに使って います。[実際にはこれは本当ではなく、マザーボード搭載のサウンドカードの ためにいくつかの特別なドライバーが必要でした。]

FreeBSD システムでも同様に立派に動作することを私は把握しています。

2.5 動作させるには?

まず、キットをビルドしてください。LAME をまず最初にインストールしておく と*とても*役に立ちます。そして avserver の ./configure を実行する際に、 確実に --enable-mp3lame フラグを有効にしておいてください。

LAME によって Windows Media Player に対して音声をストリーミングできるように なるため重要です。他のオーディオのタイプでは動作しない理由を訊かないでください。

単純なテストとして、INPUTFILE が avconv でデコードできるファイルであるとして 次の2つのコマンドラインを実行してください:

./avserver -f doc/avserver.conf &
./avconv -i INPUTFILE http://localhost:8090/feed1.ffm

この時点で Windows 機に行き Windows Media Player (WMP) を始動できるように するはずです。”URL を開く” を選択し、

    http://<linuxbox>:8090/test.asf

を入力してください。(ちょっと遅れて)映像が見れて音声が聞こえるはずです。

警告: test1.mpg をストリームしようとしても WMP では動作しません。 再生を開始する前にファイル全体を転送しようとするからです。 これは AVI ファイルにも当てはまります。

2.6 次にすることは?

(フレームレートなどの条件について)必要に合わせて avserver.conf ファイルを 編集してするべきです。そして avserver と avconv をインストールし、 それらを開始するスクリプトを書き、そして始めてください。

2.7 トラブルシューティング

2.7.1 音声が聞こえません、映像は問題ないのです。

おそらく LAME をインストールしなかったか、あるいは ./configure ステートメント が間違っていたのでしょう。MP3 を参照する行が現れていないか見るために avconv の出力を確認してください。もし無ければ、あなたの構成は正しくない です。サウンドカードが正しい入力源からデータを取っていないのかもしれません。 ステレオでのみキャプチャーし、かつ1つのチャンネルは弾かれる必要があるような 本当にひどいオーディオインターフェースを(私のように)使っているのかもしれない。 あなたがこういった人たちの一員なら、avconv を開始する前に ’AUDIO_FLIP_LEFT=1’ をエクスポートしてください。

2.7.2 しばらくしてから音声と映像を同期しなくなります。

そうです。しなくなります。

2.7.3 WMP だとかなり時間が経ってから映像の更新レートが下がっていきます。

そうです。だれか理由が分かる?

2.7.4 WMP 7 と WMP 6.4 が違う振る舞いをします。

そうです。これについての考えがあればどんなものでも感謝して受け付けます。 これらの違いはウェブページに WMP を埋め込むときにもあらわれます。 [利用できる2つのオブジェクト ID があります: 古い方はうまく動作せず、 新しい方は動作します(両方とも同じシステムでテストしました)。しかし、 WMP 7 をインストールしない限り新しい方は利用できないのではないかと思います。]

2.8 他にできることは?

先に記録された .ffm ファイルからビデオを再生することができます。 しかし、多くの注意書きがあり、その中には avserver のパラメーターは そのファイルが記録された時に使われた本来のパラメーターと一致していなければ ならない、という事実があります。そうでなければ、ファイルに記録する前に avserver はそのファイルを削除します。 (今これを書いている段階では、この部分は壊れています。)

多くのコーデックの選択肢やエンコーディングのパラメーターをいじることができ、 制御できないパラメーターはさらにたくさんあります。’絶対にあるほうがよい’ パラメーターがあれば、メーリングリストにメッセージを投稿してください。 現時点で利用できる制御項目のリストについては avserver.conf をのぞいてみてください。

ブラウザでよく使われる ASX または RAM ファイルを自動的に生成することが できます。これらのファイルは実際には基底にある ASF または RM ファイルへ リダイレクトされます。こうする理由は、ブラウザが外部のビューアを起動する 前にファイル全体を取得するからです。リダイレクト元のファイルはとても小さく すぐに転送できます。[ストリームそのものはしばしば’無限’で、そのため ブラウザはそれをダウンロードしようとし、決して終わりません。]

2.9 ヒント

* ライブのストリームに接続しているとき、ほとんどのプレイヤー(WMP、RA、等)は 元の内容を数秒間バッファすることを求め、連続的に信号を表示することができる ようにします。しかし、avserver は(既定の動作としては)リアルタイムでデータの 送信を開始します。この結果、プレイヤーによってバッファリングが行われている 間、数秒間一時停止します。都合の良いことに、URL の末尾に ’?buffer=5’ を追加 することによって、これを回復することができます。この追加の意味することは、 ストリームが5秒前に開始するようにする – そのためストリームの最初の5秒は ネットワークで可能な限り素早く送信されます。そして実時間に向けてスロー ダウンするでしょう。これによって顕著に起動体験が改善されるでしょう。

また ’Preroll 15’ という文を avserver.conf に追加することで、別途時間が 指定されていない全ての要求に対して、15 秒間の事前バッファリングを加える ようにできます。さらに、avserver はキーフレームが見つかるまでフレームを とばすようになります。これは、捨てられるであろうデータを転送しないことに より、さらに起動の遅れを減らします。

* ライブのストリームによって消費される帯域幅の量を制限するために avserver.conf の中の MaxBandwidth を調整したくなるでしょう。

2.10 しばらくするとバッファリング/事前ロールが止まるのはなぜ?

(少なくとも私のマシンでは)グラブに成功するフレームの数が増えるほど、 少しずつグラブされるべきフレームの数が減ります。これの意味することは、 エンコードされたデータストリームのタイムスタンプは実際の時間より 遅くなります。つまり、’Preroll 10’ とすると、ストリームが 10秒または それ以上遅れる際に、残る事前ロールがなくなります。

これを修正するには、タイムスタンプを扱う処理の内部を変更することが 求められます。

2.11 ?date= は有効ですか?

はい(上で述べた制限を受けますが)。また、avserver を開始するときはいつでも (どれかのパラメーターが変わっていれば)ffm ファイルは削除されます、 したがって以前に記録したものは一掃されます。

?date=xxxxxx の書式はかなり柔軟です。 次の書式のいずれかを使うことになります(’T’ は文字そのものです):

* YYYY-MM-DDTHH:MM:SS     (現地時間)
* YYYY-MM-DDTHH:MM:SSZ    (世界標準時)

YYYY-MM-DD を省略できます。その場合現在の日付が参照されます。しかし ‘?date=16:00:00’ は本日の 16:00 を参照することに注意してください – これは未来になってしまうことがあり、そのため便利とはいえません。

ストリームのために URL の末尾に ?date= を加えることでこれを利用できます。 例えば: ‘http://localhost:8080/test.asf?date=2002-07-26T23:05:00’.

3 オプション

数値のオプションは全て(そうではないと明記していない限り) 1つの数を表す入力文字列を受け取ります。それには国際単位系の接頭辞 (例えば ’K’、’M’、’G’)を1つ含めてもかまいません。 この接頭辞の直後に ’i’ を付け加えると、10の累乗の代わりに2の累乗 が使われます。 ’B’ という接尾辞は値を8倍し、また他の接尾辞に付け加えても単独でも どちらでも使えます。これによって例えば ’KB’、’MiB’、’G’ や ’B’ が接尾辞として許されます。

引数をとらないオプションはブール値のオプションであり、対応する値を true にします。オプション名の前に "no" をつけることで false に できます。例えば、コマンドラインで "-nofoo" とすることで "foo" という 名前のブール値のオプションが false になります。

3.1 ストリーム指定子

オプションには、例えばビットレートやコーデックのように、ストリームごとに適用されるものがあります。 ストリーム指定子は与えられたオプションがどのストリームに属するかを正確に指定するために使われます。

ストリーム指定子は文字列で、コロンによって区切られた省略可能なオプションの名前を追加されます。 例えば -codec:a:1 ac3 というオプションは a:1 というストリーム指定子を含み、 これは2番目の音声ストリームに対応します。したがってこのオプションは2番目の音声ストリームの ac3 コーデックを選択します。

ストリーム指定子はいくつかのストリームにマッチし、その場合それら全てにそのオプションは 適用されます。例えば -b:a 128k でのストリーム指定子は全ての音声ストリームに マッチします。

空のストリーム指定子は全てのストリームにマッチし、例えば -codec copy あるいは -codec: copy は再エンコーディングすることなしに全てのストリームをコピーします。

可能なストリーム指定子の形は以下のとおりです:

stream_index

このインデックスを持つストリームにマッチします。例えば -threads:1 4 は 2番目のストリームのスレッドカウントを4に設定します。

stream_type[:stream_index]

stream_type は次のいずれかです: 映像のための ’v’、音声のための ’a’、 字幕のための ’s’、データのための ’d’、アタッチメントのための’t’。 stream_index が与えられていれば、その種類のストリーム番号 stream_index のものにマッチします。 さもなくばその種類の全てのストリームにマッチします。

p:program_id[:stream_index]

stream_index が与えられていれば、id program_id を持つプログラムの ストリーム番号 stream_index のものにマッチします。さもなくば そのプログラムの全てのストリームにマッチします。

3.2 一般的なオプション

これらのオプションは av* ツールの間で共有されます。

-L

ライセンスを表示します。

-h, -?, -help, --help [arg]

ヘルプを表示します。省略可能なパラメーターで特定の項目についての ヘルプを表示するように指定できます。

arg に可能な値は:

decoder=decoder_name

decoder_name という名前のデコーダーについての詳細な情報を表示します。 全てのデコーダーの一覧を取得するには ‘-decoders’ オプションを使ってください。

encoder=encoder_name

encoder_name という名前のエンコーダーについての詳細な情報を表示します。 全てのエンコーダーの一覧を取得するには ‘-encoders’ オプションを使ってください。

demuxer=demuxer_name

demuxer_name という名前のデミュクサーについての詳細な情報を表示します。 全てのミュクサーおよびデミュクサーの一覧を取得するには ‘-formats’ オプションを使ってください。

muxer=muxer_name

muxer_name という名前のミュクサーについての詳細な情報を表示します。 全てのミュクサーおよびデミュクサーの一覧を取得するには ‘-formats’ オプションを使ってください。

-version

バージョンを表示します。

-formats

利用可能なフォーマットを表示します。

フォーマット名の前にあるフィールドは次のような意味があります:

D

デコーディングが利用できる

E

エンコーディングが利用できる

-codecs

libavcodec に認識される全てのコーデックを表示します。

この文書では’コーデック’という用語はより正確にはメディアビットストリーム形式 とよぶべきものの短縮名であることに注意してください。

-decoders

利用可能なデコーダーを表示します。

-encoders

利用可能なエンコーダーを表示します。

-bsfs

利用可能な bitstream フィルターを表示します。

-protocols

利用可能なプロトコルを表示します。

-filters

利用可能な libavfilter フィルターを表示します。

-pix_fmts

利用可能な pixel フォーマットを表示します。

-sample_fmts

利用可能なサンプルフォーマットを表示します。

-loglevel loglevel | -v loglevel

そのライブラリで使用されるログの冗長さを設定します。 loglevel は以下の値の1つを含んだ数値または文字列:

quiet
panic
fatal
error
warning
info
verbose
debug

既定ではプログラムは標準エラー出力にログを出力し、端末が色付けに 対応していれば、エラーと警告に印をつけるように色が使われます。 ログの色付けは環境変数 AV_LOG_FORCE_NOCOLOR または NO_COLOR をセットすることで無効にでき、 また環境変数 AV_LOG_FORCE_COLOR をセットすることで強制できます。 環境変数 NO_COLOR の利用は非推奨で、今後の Libav のバージョンでは なくなる予定です。

3.3 AVOptions

これらのオプションは libavformat、libavdevice および libavcodec によって 直接提供されています。利用できる AVOptions の一覧を見るには、‘-help’ オプションを使ってください。これらは2つのカテゴリーに分けられます:

generic

これらのオプションはどのコンテナ、コーデック、またはデバイスでも設定できます。 Generic オプションはコンテナ/デバイスについては AVFormatContext オプションの 下に、コーデックについては AVCodecContext オプションの下にあります。

private

これらのオプションは特定のコンテナ、デバイス、またはコーデック専用のものです。 Private オプションは対応するコンテナ/デバイス/コーデックの下にあります。

例えば既定の ID3v2.4 の代わりに ID3v2.3 ヘッダを MP3 ファイルに書き込むには、 MP3 ミュクサーの ‘id3v2_version’ という private オプションを使って ください:

avconv -i input.flac -id3v2_version 3 out.mp3

全てのコーデックの AVOptions は明らかにストリームごとなので、ここには ストリーム指定子のチャプターの説明が適用されます。

注意として、‘-nooption’ 構文はブール値の AVOptions では使えないので、 ‘-option 0’/‘-option 1’ を使ってください。

注意2として、v/a/s をオプション名の前に付けてストリームごとの AVOption を 指定するという、従来の文書化されていない方法は、現在非推奨で近いうちに削除されます。

3.4 Main options

-f configfile

/etc/avserver.conf’ の代わりに ‘configfile’ を使います。

-n

no-launch モードを有効にします。このオプションは各種の <Stream> セクションの中の すべての Launch ディレクティブを無効にします。avserver はどの avconv インスタンスも 起動しないので、それらを手動で起動しなければならないでしょう。

-d

debug モードを有効にします。このオプションはログの冗長性を増やし、 ログメッセージを標準出力に向け、avserver をデーモンとしてではなく フォアグラウンドで動作させます。