Wowza Streaming Engine stream名に制限をかける方法

Wowza Java Video Streaming
Author: @nishio-dens / 2018年02月22日に投稿

Wowzaでライブ動画を配信する際、配信者はストリーム名を指定します。 このストリーム名はデフォルトではなんでも指定可能ですが、場合によっては制限を掛けたいものです。

今回はストリーム名に制限をかけるモジュールのコードを紹介します。

ストリーム名に制限をかけるには、Wowzaのカスタムモジュールを作成する必要があります。 カスタムモジュールの作り方は、こちらを参考にしてください。

以下コードで配信者が新規接続してきたときにフックをかけられます。

package net.densanlabs;

import com.wowza.wms.application.*;
import com.wowza.wms.amf.*;
import com.wowza.wms.client.*;
import com.wowza.wms.module.*;
import com.wowza.wms.request.*;
import com.wowza.wms.stream.*;
import com.wowza.wms.rtp.model.*;
import com.wowza.wms.httpstreamer.model.*;
import com.wowza.wms.httpstreamer.cupertinostreaming.httpstreamer.*;
import com.wowza.wms.httpstreamer.smoothstreaming.httpstreamer.*;

public class WowzaLimitation extends ModuleBase {

    // publishは配信要求が来たときに呼ばれる
    public void publish(IClient client, RequestFunction function, AMFDataList params) {
        // ストリーム名を取得する
        String streamName = getParamString(params, PARAM1);
        getLogger().info("Streams from client: " + streamName);

        if (streamName.equals("testtest")) {
            // stream名が testtest だったら配信許可
            // 接続可能なstream名を別システムから取得するなどの連携が考えられる
            invokePrevious(client, function, params);
        } else {
            // stream名がtesttest以外だったら拒否(切断)
            getLogger().info("You cannot use this stream name " + streamName);
            sendClientOnStatusError(client, "NetStream.Publish.BadName", "You cannot use this stream.");
            client.setShutdownClient(true);
        }
    }

    // connection release要求が来たときに呼ばれる
    public void releaseStream(IClient client, RequestFunction function, AMFDataList params) {
      // publishと同様なので省略 ...
    }
}

例えばストリーム名を特殊なhash値などにして、hash値を知らない人は配信できないようにすることが可能です。

ストリーム名は視聴者側も知り得る情報です。場合によっては配信者が指定するストリーム名と視聴者が指定するストリーム名を別のものにしたいものです。 以下のようにパラメータを書き換えることで実現可能です。

package net.densanlabs.net;

import com.wowza.wms.application.*;
import com.wowza.wms.amf.*;
import com.wowza.wms.client.*;
import com.wowza.wms.module.*;
import com.wowza.wms.request.*;
import com.wowza.wms.stream.*;
import com.wowza.wms.rtp.model.*;
import com.wowza.wms.httpstreamer.model.*;
import com.wowza.wms.httpstreamer.cupertinostreaming.httpstreamer.*;
import com.wowza.wms.httpstreamer.smoothstreaming.httpstreamer.*;

public class WowzaLimitation extends ModuleBase {

    public void publish(IClient client, RequestFunction function, AMFDataList params) {
        String streamName = getParamString(params, PARAM1);
        getLogger().info("Streams from client: " + streamName);

        if (streamName.equals("testtest")) {
            // stream名が testtest だったら配信許可
            // さらにストリーム名を published に書き換えて配信
            params.set(PARAM1, "published");
            invokePrevious(client, function, params);
        } else {
            getLogger().info("You cannot use this stream name " + streamName);
            sendClientOnStatusError(client, "NetStream.Publish.BadName", "You cannot use this stream.");
            client.setShutdownClient(true);
        }
    }