「自由なディレクトリでコンテンツをストリームする方法」の和訳

HOWTO stream content to/from custom directories の 2007/05/13 版。ライブストリームの話も出てくるかと思ったが、完全にオンデマンド配信に関することしか書いていない。本当に「翻訳したからなんなの?」という文書。

自由なディレクトリでコンテンツをストリームする方法

(訳注: ライセンスは他の Open Source Flash のドキュメント群から類推するに Creative Commons だと思うのだが、明示されていない。Red5 同梱であるせいでこのままだと GPL が適用されてしまうのだがどうなっているのだろう)

Author
Joachim Bauch
Contact
jojo@struktur.de
Date
$Date$
Revision
$Revision$
Id
$Id$

... コンテンツ::

前書き

このドキュメントはアプリケーションがどうやってウェブアプリケーションの中にあるデフォルトの `streams` フォルダ以外の自由なディレクトリにオンデマンドビデオ(VOD)を保存、配信していくのかについて記述しています。

ファイル名生成サービス

Red5 は特定のスコープに提供される機能を持った「スコープサービス」と呼ばれる概念を使用します。これらのスコープサービスのうちの一つが、保存または再生されるべき VOD ストリームのファイル名を生成する IStreamFilenameGenerator_ です。

カスタムジェネレーター

異なるフォルダのファイル名を生成するには、新しいファイル名ジェネレーターが実装されていなければなりません::

import org.red5.server.api.IScope;
import org.red5.server.api.stream.IStreamFilenameGenerator;

public class CustomFilenameGenerator implements IStreamFilenameGenerator {

  /** 保存されたビデオを保存するパス */
  public String recordPath = "recordedStreams/";
  /** VOD ストリームが入っているパス */
  public String playbackPath = "videoStreams/";
  
  public String generateFilename(IScope scope, String name,
      GenerationType type) {
    // 拡張子を除いたファイル名を生成
    return generateFilename(scope, name, null, type);
  }

  public String generateFilename(IScope scope, String name,
      String extension, GenerationType type) {
    String filename;
    if (type == GenerationType.RECORD)
      filename = recordPath + name;
    else
      filename = playbackPath + name;
    
    if (extension != null)
      // 拡張子を追加
      filename += extension;
    
    return filename;
  }
}

上記のクラスは `recordedStreams/red5RecordDemo1234.flv` のようなストリームの保存用ファイル名を生成し、全ての VOD ストリームのソースに `videoStreams` ディレクトリを使います。

カスタムジェネレーターの稼動

次のステップとして、カスタムジェネレーターが任意のアプリケーションの設定ファイルの中で有効にされていなければなりません。

以下の定義を `yourApp/WEB-INF/red5-web.xml` に追加してください::

<bean id="streamFilenameGenerator" 
      class="path.to.your.CustomFilenameGenerator" />

この設定により、ストリームのファイル名を生成するために前述のクラスを使うようになります。

設定ファイルを通してパスを変更する

ここで書いたクラスは期待通りに動きますが、書き換えるたびにクラスの再コンパイルが必要なコードの中のパスを変更するのは少々不便です。

そのため、設定ファイルの中で使うパスを指定する前回のステップの中で定義された bean に、パラメーターを渡すことができます。

設定ファイルがパースされる際に実行されたクラスに二つの関数を追加します::

public void setRecordPath(String path) {
  recordPath = path;
}

public void setPlaybackPath(String path) {
  playbackPath = path;
}

そしてこのように bean 定義の中でパスを設定することができます::

<bean id="streamFilenameGenerator" 
      class="path.to.your.CustomFilenameGenerator">
  <property name="recordPath" value="recordedStreams/" />
  <property name="playbackPath" value="videoStreams/" />
</bean>

`yourApp/WEB-INF/red5-web.properties` ファイルへパスを移動し、それらにアクセスするパラメーターを使うこともできます::

<bean id="streamFilenameGenerator" 
      class="path.to.your.CustomFilenameGenerator">
  <property name="recordPath" value="${recordPath}" />
  <property name="playbackPath" value="${playbackPath}" />
</bean>

その場合プロパティーファイルに以下の行を追加しなければなりません::

    recordPath=recordedStreams/
    playbackPath=videoStreams/