【问题标题】:How to dynamically create and change stream targets in wowza streaming engine如何在 wowza 流引擎中动态创建和更改流目标
【发布时间】:2016-10-26 06:04:59
【问题描述】:

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

【问题讨论】:

    标签: java api module wowza wowza-transcoder


    【解决方案1】:

    您可以使用 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);
    	}
    }

    【讨论】:

    • 谢谢米歇尔。我会尝试一下,看看结果。
    猜你喜欢
    • 2014-06-29
    • 2016-03-18
    • 2016-04-27
    • 2017-09-05
    • 1970-01-01
    • 2016-06-01
    • 2017-02-28
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多