2
私はサーバー側モジュールを開発しています。入力ストリームに基づいてストリームターゲットを動的に変更したいと思います。私はどのようにWowzaストリーミングエンジンでJava APIを使用してそれを行うかを知りたい。wowzaストリーミングエンジンでストリームターゲットを動的に作成および変更する方法
私はサーバー側モジュールを開発しています。入力ストリームに基づいてストリームターゲットを動的に変更したいと思います。私はどのようにWowzaストリーミングエンジンでJava APIを使用してそれを行うかを知りたい。wowzaストリーミングエンジンでストリームターゲットを動的に作成および変更する方法
com.wowza.wms.pushpublish。*パッケージ(Wowzaインストールに付属しているserverapiおよびwowzaサイトに記載されています)を使用して、パブリッシュ・イベントを代行受信し、ストリーム・ターゲットを作成できます)。以下は、同じWowzaアプリケーションに "push-"という接頭辞が付いたRTMPストリームターゲットを作成するサンプルコードです。
package com.wowza.wms.plugin.pushpublish.module;
import java.util.*;
import com.wowza.wms.amf.AMFPacket;
import com.wowza.wms.application.IApplicationInstance;
import com.wowza.wms.logging.WMSLoggerFactory;
import com.wowza.wms.module.ModuleBase;
import com.wowza.wms.pushpublish.protocol.rtmp.*;
import com.wowza.wms.stream.*;
public class ModulePushPublishSimpleExample extends ModuleBase
{
\t Map<IMediaStream, PushPublishRTMP> publishers = new HashMap<IMediaStream, PushPublishRTMP>();
\t
\t class StreamNotify implements IMediaStreamActionNotify2
\t {
\t \t public void onPlay(IMediaStream stream, String streamName, double playStart, double playLen, int playReset)
\t \t {
\t \t }
\t \t public void onPause(IMediaStream stream, boolean isPause, double location)
\t \t {
\t \t }
\t \t public void onSeek(IMediaStream stream, double location)
\t \t {
\t \t }
\t \t public void onStop(IMediaStream stream)
\t \t {
\t \t }
\t \t public void onMetaData(IMediaStream stream, AMFPacket metaDataPacket)
\t \t {
\t \t }
\t \t public void onPauseRaw(IMediaStream stream, boolean isPause, double location)
\t \t {
\t \t }
\t \t
\t \t public void onPublish(IMediaStream stream, String streamName, boolean isRecord, boolean isAppend)
\t \t {
\t \t \t if (!streamName.startsWith("push-")) // this is here to avoid looping pushes
\t \t \t {
\t \t \t \t try
\t \t \t \t {
\t \t \t \t \t IApplicationInstance appInstance = stream.getStreams().getAppInstance();
\t \t \t \t \t
\t \t \t \t \t synchronized(publishers)
\t \t \t \t \t {
\t \t \t \t \t \t PushPublishRTMP publisher = new PushPublishRTMP();
\t \t \t \t \t \t
\t \t \t \t \t \t // Source stream
\t \t \t \t \t \t publisher.setAppInstance(appInstance);
\t \t \t \t \t \t publisher.setSrcStreamName(streamName);
\t \t \t \t \t \t // Destination stream
\t \t \t \t \t \t String dstHost = "localhost";
\t \t \t \t \t \t int dstPort = 1935;
\t \t \t \t \t \t String dstApplication = appInstance.getApplication().getName();
\t \t \t \t \t \t String dstStreamName = "push-"+streamName;
\t \t \t \t \t \t String flashVersion = PushPublishRTMP.CURRENTFMLEVERSION;
\t \t \t \t \t \t
\t \t \t \t \t \t // Uncomment and update with Akamai account info if pushing to Akamai
\t \t \t \t \t \t //String streamId = "32637";
\t \t \t \t \t \t //String akamaiUsername = "134706";
\t \t \t \t \t \t //String akamaiPassword = "wowza";
\t \t \t \t \t \t //boolean isPrimary = true;
\t \t \t \t \t \t //dstHost = (isPrimary?"p":"b")+".ep"+streamId+".i.akamaientrypoint.net";
\t \t \t \t \t \t //dstApplication = "EntryPoint";
\t \t \t \t \t \t //dstStreamName = streamName+"_1_950"+"@"+streamId;
\t \t \t \t \t \t //flashVersion = PushPublishRTMP.CURRENTFLASHVERSION;
\t \t \t \t \t \t //
\t \t \t \t \t \t //publisher.setAkamaiUserName(akamaiUsername);
\t \t \t \t \t \t //publisher.setAkamaiPassword(akamaiPassword);
\t \t \t \t \t \t // Destination stream
\t \t \t \t \t \t publisher.setHost(dstHost);
\t \t \t \t \t \t publisher.setPort(dstPort);
\t \t \t \t \t \t publisher.setDstApplicationName(dstApplication);
\t \t \t \t \t \t publisher.setDstStreamName(dstStreamName);
\t \t \t \t \t \t publisher.setConnectionFlashVersion(flashVersion);
\t \t \t \t \t \t
\t \t \t \t \t \t // Uncomment if pushing to Adobe Media Server
\t \t \t \t \t \t //publisher.setSendOriginalTimecodes(true);
\t \t \t \t \t \t //publisher.setOriginalTimecodeThreshold(0x100000);
\t \t \t \t \t \t // SecureToken shared secret
\t \t \t \t \t \t //publisher.setSecureTokenSharedSecret("#ed%h0#[email protected]");
\t \t \t
\t \t \t \t \t \t publisher.setSendFCPublish(true);
\t \t \t \t \t \t publisher.setSendReleaseStream(true);
\t \t \t \t \t \t publisher.setSendOnMetadata(true);
\t \t \t \t \t \t publisher.setDebugLog(true);
\t \t \t \t \t \t publisher.setDebugPackets(false);
\t \t \t \t \t \t \t \t \t
\t \t \t \t \t \t // Uncomment if target server protected using RTMP authentication
\t \t \t \t \t \t //PushPublishRTMPAuthProviderAdobe adobeRTMPAuthProvider = new PushPublishRTMPAuthProviderAdobe();
\t \t \t \t \t \t //adobeRTMPAuthProvider.init(publisher);
\t \t \t \t \t \t //adobeRTMPAuthProvider.setUserName("username");
\t \t \t \t \t \t //adobeRTMPAuthProvider.setPassword("password");
\t \t \t \t \t \t //publisher.setRTMPAuthProvider(adobeRTMPAuthProvider);
\t \t \t \t \t \t
\t \t \t \t \t \t publisher.connect();
\t \t \t \t \t \t publishers.put(stream, publisher);
\t \t \t \t \t }
\t \t \t \t }
\t \t \t \t catch(Exception e)
\t \t \t \t {
\t \t \t \t \t WMSLoggerFactory.getLogger(null).error("ModulePushPublishSimpleExample#StreamNotify.onPublish: "+e.toString());
\t \t \t \t }
\t \t \t }
\t \t }
\t \t public void onUnPublish(IMediaStream stream, String streamName, boolean isRecord, boolean isAppend)
\t \t {
\t \t \t stopPublisher(stream);
\t \t }
\t }
\t
\t public void stopPublisher(IMediaStream stream)
\t {
\t \t try
\t \t {
\t \t \t synchronized(publishers)
\t \t \t {
\t \t \t \t PushPublishRTMP publisher = publishers.remove(stream);
\t \t \t \t if (publisher != null)
\t \t \t \t \t publisher.disconnect();
\t \t \t }
\t \t }
\t \t catch(Exception e)
\t \t {
\t \t \t WMSLoggerFactory.getLogger(null).error("ModulePushPublishSimpleExample#StreamNotify.onPublish: "+e.toString());
\t \t }
\t }
\t
\t public void onStreamCreate(IMediaStream stream)
\t {
\t \t stream.addClientListener(new StreamNotify());
\t }
\t
\t public void onStreamDestory(IMediaStream stream)
\t {
\t \t stopPublisher(stream);
\t }
}
おかげでミシェル。私はこれを試して、結果を見てみましょう。 – Sutha