概要
**

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

     ffserver [options]

説明
**

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

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

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

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

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

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

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

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

状態ストリーム
=======

FFserver はサーバの現在の状態を表示する 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 を要求すればサーバは状態の情報を含むページを投げてくるでしょう。

これは何ができるの?
==========

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

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

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

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

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

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

動作させるには?
========

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

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

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

     ./ffserver -f doc/ffserver.conf &
     ./ffmpeg -i INPUTFILE http://localhost:8090/feed1.ffm

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

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

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

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

次にすることは?
========

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

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

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

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

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

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

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

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

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

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

他にできることは?
=========

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

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

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

ヒント
===

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

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

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

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

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

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

?date= は有効ですか?
==============

はい(上で述べた制限を受けますが)。また、ffserver を開始するときはいつでも (どれかのパラメーターが変わっていれば)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.

オプション
*****

     [file fftools-common-opts.texi not included]

Main options
============

-f CONFIGFILE
     /etc/ffserver.conf の代わりに configfile を使います。

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

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