java - 如何在wowza流引擎中动态创建和更改流目标

标签 java api module wowza wowza-transcoder

我正在开发一个服务器端模块,我想根据传入的流动态更改流目标。我想知道如何在 wowza 流引擎中使用 java API 来做到这一点。

最佳答案

您可以使用 com.wowza.wms.pushpublish.* 包(记录在 Wowza 安装附带的 serverapi 和 wowza 站点上)来拦截发布事件并创建流目标(以前称为推送发布) 。下面是一个示例代码,它创建一个前缀为“push-”的 RTMP 流目标到同一个 Wowza 应用程序。

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
{
	Map<IMediaStream, PushPublishRTMP> publishers = new HashMap<IMediaStream, PushPublishRTMP>();
	
	class StreamNotify implements IMediaStreamActionNotify2
	{

		public void onPlay(IMediaStream stream, String streamName, double playStart, double playLen, int playReset)
		{
		}

		public void onPause(IMediaStream stream, boolean isPause, double location)
		{
		}

		public void onSeek(IMediaStream stream, double location)
		{
		}

		public void onStop(IMediaStream stream)
		{
		}

		public void onMetaData(IMediaStream stream, AMFPacket metaDataPacket)
		{
		}

		public void onPauseRaw(IMediaStream stream, boolean isPause, double location)
		{
		}
		
		public void onPublish(IMediaStream stream, String streamName, boolean isRecord, boolean isAppend)
		{
			if (!streamName.startsWith("push-")) // this is here to avoid looping pushes
			{
				try
				{
					IApplicationInstance appInstance = stream.getStreams().getAppInstance();
					
					synchronized(publishers)
					{
						PushPublishRTMP publisher = new PushPublishRTMP();
						
						// Source stream
						publisher.setAppInstance(appInstance);
						publisher.setSrcStreamName(streamName);

						// Destination stream
						String dstHost = "localhost";
						int dstPort = 1935;
						String dstApplication = appInstance.getApplication().getName();
						String dstStreamName = "push-"+streamName;
						String flashVersion = PushPublishRTMP.CURRENTFMLEVERSION;
						
						// Uncomment and update with Akamai account info if pushing to Akamai
						//String streamId = "32637";
						//String akamaiUsername = "134706";
						//String akamaiPassword = "wowza";
						//boolean isPrimary = true;
						//dstHost = (isPrimary?"p":"b")+".ep"+streamId+".i.akamaientrypoint.net";
						//dstApplication = "EntryPoint";
						//dstStreamName = streamName+"_1_950"+"@"+streamId;
						//flashVersion = PushPublishRTMP.CURRENTFLASHVERSION;
						//
						//publisher.setAkamaiUserName(akamaiUsername);
						//publisher.setAkamaiPassword(akamaiPassword);

						// Destination stream
						publisher.setHost(dstHost);
						publisher.setPort(dstPort);
						publisher.setDstApplicationName(dstApplication);
						publisher.setDstStreamName(dstStreamName);
						publisher.setConnectionFlashVersion(flashVersion);
						
						// Uncomment if pushing to Adobe Media Server
						//publisher.setSendOriginalTimecodes(true);
						//publisher.setOriginalTimecodeThreshold(0x100000);

						// SecureToken shared secret
						//publisher.setSecureTokenSharedSecret("#ed%h0#w@1");
			
						publisher.setSendFCPublish(true);
						publisher.setSendReleaseStream(true);
						publisher.setSendOnMetadata(true);
						publisher.setDebugLog(true);
						publisher.setDebugPackets(false);
									
						// Uncomment if target server protected using RTMP authentication
						//PushPublishRTMPAuthProviderAdobe adobeRTMPAuthProvider = new PushPublishRTMPAuthProviderAdobe();
						//adobeRTMPAuthProvider.init(publisher);
						//adobeRTMPAuthProvider.setUserName("username");
						//adobeRTMPAuthProvider.setPassword("password");
						//publisher.setRTMPAuthProvider(adobeRTMPAuthProvider);
						
						publisher.connect();
						publishers.put(stream, publisher);
					}
				}
				catch(Exception e)
				{
					WMSLoggerFactory.getLogger(null).error("ModulePushPublishSimpleExample#StreamNotify.onPublish: "+e.toString());
				}
			}
		}

		public void onUnPublish(IMediaStream stream, String streamName, boolean isRecord, boolean isAppend)
		{
			stopPublisher(stream);
		}
	}
	
	public void stopPublisher(IMediaStream stream)
	{
		try
		{
			synchronized(publishers)
			{
				PushPublishRTMP publisher = publishers.remove(stream);
				if (publisher != null)
					publisher.disconnect();
			}
		}
		catch(Exception e)
		{
			WMSLoggerFactory.getLogger(null).error("ModulePushPublishSimpleExample#StreamNotify.onPublish: "+e.toString());
		}
	}
	
	public void onStreamCreate(IMediaStream stream)
	{
		stream.addClientListener(new StreamNotify());
	}
	
	public void onStreamDestory(IMediaStream stream)
	{
		stopPublisher(stream);
	}
}

关于java - 如何在wowza流引擎中动态创建和更改流目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37999508/

相关文章:

java - 无法以编程方式在电子邮件中附加图片

Java 程序不会对窗口大小调整使用react

java - 使用小程序在客户端计算机上创建和写入文件时出错

java - 如何使用 Java 正则表达式从文本中排除双引号?

javascript - 声云API : getting this simple example to work

javascript - 实现可设置模块作用域变量的最常见模式

database - 在PostgreSQL中获取lobject的大小

python-3.x - 在 google-vision text-detection api 中在哪里使用语言提示?

python - 在 Jython 中使用时 inspect.py 的问题

python-3.x - 即使模块实际上包含脚本,模块也没有属性