Package com.wowza.wms.stream.publish
Class Publisher
- Object
- 
- com.wowza.wms.stream.publish.Publisher
 
- 
 public class Publisher extends ObjectPublisher: clientless stream publisher. This class can be used to publish raw video, audio and metadata packets to the Wowza Pro server. Here is a quick snippet of code that illustrates how to use it. This code below will publish data the stream named "myStream". It will be streamed to the default virtual host and avaible at the rtmp address rtmp://[server-ip-address]/streamtest. IVHost vhost = VHostSingleton.getInstance(VHost.VHOST_DEFAULT); Publisher publisher = Publisher.createInstance(vhost, "streamtest"); publisher.setFileExtension("flv"); publisher.setStreamType("live"); publisher.publish("myStream", "live"); // sit in a loop adding data boolean done = false; while(true) { AMFPacket amfPacket; // read packet from audio, video, data source // amfPacket = readPacketFromSomewhere(); switch (amfPacket.getType()) { case IVHost.CONTENTTYPE_AUDIO: publisher.addAudioData(amfPacket.getData(), amfPacket.getSize(), amfPacket.getTimecode()); break; case IVHost.CONTENTTYPE_VIDEO: publisher.addVideoData(amfPacket.getData(), amfPacket.getSize(), amfPacket.getTimecode()); break; case IVHost.CONTENTTYPE_DATA: publisher.addDataData(amfPacket.getData(), amfPacket.getSize(), amfPacket.getTimecode()); break; } if (done) break; } publisher.unpublish(); publisher.close();Basic packet format: Audio: AAC [1-byte header] [1-byte codec config indicator (1 - audio data, 0 - codec config packet)] [n-bytes audio content or codec config data] All others [1-byte header] [n-bytes audio content] Below is the bit layout of the header byte of data (table goes from least significant bit to most significant bit): 1 bit Number of channels: 0 mono 1 stereo 1 bit Sample size: 0 8 bits per sample 1 16 bits per sample 2 bits Sample rate: 0 special or 8KHz 1 11KHz 2 22KHz 3 44KHz 4 bits Audio type: 0 PCM (big endian) 1 PCM (swf - ADPCM) 2 MP3 3 PCM (little endian) 4 Nelly Moser ASAO 16KHz Mono 5 Nelly Moser ASAO 8KHz Mono 6 Nelly Moser ASAO 7 G.711 ALaw 8 G.711 MULaw 9 Reserved a AAC b Speex f MP3 8Khz Note: For AAC the codec config data is generally a two byte packet that describes the stream. It must be published first. Here is the basic code to fill in the codec config data. AACFrame frame = new AACFrame(); int sampleRate = 22100; int channels = 2; frame.setSampleRate(sampleRate); frame.setRateIndex(AACUtils.sampleRateToIndex(sampleRate)); frame.setChannels(channels); frame.setChannelIndex(AACUtils.channelCountToIndex(sampleRate)); byte[] codecConfig = new byte[2]; AACUtils.encodeAACCodecConfig(frame, codecConfig, 0); Note: For AAC the header byte is always 0xaf Note: For Speex the audio data must be encoded as 16000Hz wide band Video: H.264 [1-byte header] [1-byte codec config indicator (1 - video data, 0 - codec config packet)] [3-byte time difference between dts and pts in milliseconds] [n-bytes video content or codec config data] All others [1-byte header] [n-bytes audio content] Below is the bit layout of the header byte of data (table goes from least significant bit to most significant bit): 4 bits Video type: 2 Sorenson Spark (H.263) 3 Screen 4 On2 VP6 5 On2 VP6A 6 Screen2 7 H.264 2 bit Frame type: 1 K frame (key frame) 2 P frame 3 B frame Note: H.264 codec config data is the same as the AVCc packet in a QuickTime container. Note: All timecode data is in milliseconds 
- 
- 
Method SummaryAll Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddAudioData(byte[] data, int offset, int len, long timecode)voidaddAudioData(byte[] data, int offset, int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)Add audio datavoidaddAudioData(byte[] data, int len, long timecode)Add audio datavoidaddAudioData(byte[] data, long timecode)Add audio datavoidaddAudioDataInc(byte[] data, int offset, int len)voidaddDataData(byte[] data, int offset, int len, long timecode)voidaddDataData(byte[] data, int offset, int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)Add metadatavoidaddDataData(byte[] data, int len, long timecode)Add metadatavoidaddDataData(byte[] data, long timecode)Add metadatavoidaddDataDataInc(byte[] data, int offset, int len)voidaddVideoData(byte[] data, int offset, int len, long timecode)Add video datavoidaddVideoData(byte[] data, int offset, int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)Add video datavoidaddVideoData(byte[] data, int len, long timecode)Add video datavoidaddVideoData(byte[] data, long timecode)Add video datavoidaddVideoDataInc(byte[] data, int offset, int len)voidclose()Close the publisherstatic PublishercreateInstance(IApplicationInstance appInstance)static PublishercreateInstance(IVHost vhost, String applicationName)static PublishercreateInstance(IVHost vhost, String applicationName, String appInstanceName)voidcreateStream()Create underlying IMediaStream object if not already createdvoidflush()Flush the packets from the input buffer to the output bufferIApplicationInstancegetAppInstance()StringgetFileExtension()Get the file extension (default flv)longgetLastAudioTimecode()Get last audio timecode written through this publisher (millseconds).longgetLastDataTimecode()Get last data timecode written through this publisher (millseconds).longgetLastGapAudioTimecode()Get gap time from last audio timecode.longgetLastGapVideoTimecode()Get gap time from last video timecode.longgetLastVideoTimecode()Get last video timecode written through this publisher (millseconds).longgetMaxTimecode()Highest timecode written through this publisher (millseconds).IMediaStreamgetStream()Get the media stream objectStringgetStreamType()booleanisPublishDataEvents()voidpublish(String streamName)Publish a stream (null to stop publishing)voidpublish(String streamName, String howToPublish)Start publishing a stream (streamName = null to stop).voidsetFileExtension(String fileExtension)Set the file extensionvoidsetPublishDataEvents(boolean publishDataEvents)voidsetStreamType(String streamType)Set the stream type (default live)voidstartAudioData(int len, long timecode)voidstartAudioData(int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)voidstartDataData(int len, long timecode)voidstartDataData(int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)voidstartVideoData(int len, long timecode)voidstartVideoData(int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)voidunpublish()voidunregisterStreamFromStreamMap()Remove the stream from MediaStreamMap
 
- 
- 
- 
Method Detail- 
createInstancepublic static Publisher createInstance(IVHost vhost, String applicationName, String appInstanceName) 
 - 
createInstancepublic static Publisher createInstance(IApplicationInstance appInstance) 
 - 
getStreampublic IMediaStream getStream() Get the media stream object- Returns:
- media stream object
 
 - 
getStreamTypepublic String getStreamType() 
 - 
setStreamTypepublic void setStreamType(String streamType) Set the stream type (default live)- Parameters:
- streamType- stream type
 
 - 
publishpublic void publish(String streamName) Publish a stream (null to stop publishing)- Parameters:
- streamName- stream name
 
 - 
getFileExtensionpublic String getFileExtension() Get the file extension (default flv)- Returns:
- file extension
 
 - 
setFileExtensionpublic void setFileExtension(String fileExtension) Set the file extension- Parameters:
- fileExtension- file extension
 
 - 
getAppInstancepublic IApplicationInstance getAppInstance() 
 - 
unpublishpublic void unpublish() 
 - 
createStreampublic void createStream() Create underlying IMediaStream object if not already created
 - 
unregisterStreamFromStreamMappublic void unregisterStreamFromStreamMap() Remove the stream from MediaStreamMap
 - 
publishpublic void publish(String streamName, String howToPublish)Start publishing a stream (streamName = null to stop). Valid howToPublish values are (live, record, append)- Parameters:
- streamName- stream name
- howToPublish- publish method (live, record, append)
 
 - 
addVideoDatapublic void addVideoData(byte[] data, long timecode)Add video data- Parameters:
- data- data
- timecode- absolute timecode (milliseconds)
 
 - 
addVideoDatapublic void addVideoData(byte[] data, int len, long timecode)Add video data- Parameters:
- data- data
- len- data length
- timecode- absolute timecode (milliseconds)
 
 - 
addVideoDatapublic void addVideoData(byte[] data, int offset, int len, long timecode)Add video data- Parameters:
- data- data
- offset- offset
- len- data length
- timecode- absolute timecode (milliseconds)
 
 - 
addVideoDatapublic void addVideoData(byte[] data, int offset, int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)Add video data- Parameters:
- data- data
- offset- offset
- len- data length
- timecode- absolute timecode (milliseconds)
- extraData- extra data
 
 - 
startVideoDatapublic void startVideoData(int len, long timecode)
 - 
startVideoDatapublic void startVideoData(int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)
 - 
addVideoDataIncpublic void addVideoDataInc(byte[] data, int offset, int len)
 - 
startAudioDatapublic void startAudioData(int len, long timecode)
 - 
startAudioDatapublic void startAudioData(int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)
 - 
addAudioDataIncpublic void addAudioDataInc(byte[] data, int offset, int len)
 - 
addAudioDatapublic void addAudioData(byte[] data, long timecode)Add audio data- Parameters:
- data- data
- timecode- absolute timecode (milliseconds)
 
 - 
addAudioDatapublic void addAudioData(byte[] data, int len, long timecode)Add audio data- Parameters:
- data- data
- len- data length
- timecode- absolute timecode (milliseconds)
 
 - 
addAudioDatapublic void addAudioData(byte[] data, int offset, int len, long timecode)
 - 
addAudioDatapublic void addAudioData(byte[] data, int offset, int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)Add audio data- Parameters:
- data- data
- len- data length
- offset- offset
- timecode- absolute timecode (milliseconds)
 
 - 
addDataDatapublic void addDataData(byte[] data, long timecode)Add metadata- Parameters:
- data- data
- timecode- absolute timecode (milliseconds)
 
 - 
addDataDatapublic void addDataData(byte[] data, int len, long timecode)Add metadata- Parameters:
- data- data
- len- data length
- timecode- absolute timecode (milliseconds)
 
 - 
addDataDatapublic void addDataData(byte[] data, int offset, int len, long timecode)
 - 
addDataDatapublic void addDataData(byte[] data, int offset, int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)Add metadata- Parameters:
- data- data
- offset- offset
- len- data length
- timecode- absolute timecode (milliseconds)
 
 - 
startDataDatapublic void startDataData(int len, long timecode)
 - 
startDataDatapublic void startDataData(int len, long timecode, java.util.Map<String,IAMFPacketExtraData> extraData)
 - 
addDataDataIncpublic void addDataDataInc(byte[] data, int offset, int len)
 - 
flushpublic void flush() Flush the packets from the input buffer to the output buffer
 - 
closepublic void close() Close the publisher
 - 
getMaxTimecodepublic long getMaxTimecode() Highest timecode written through this publisher (millseconds).- Returns:
- highest timecode written through this publisher (millseconds)
 
 - 
getLastAudioTimecodepublic long getLastAudioTimecode() Get last audio timecode written through this publisher (millseconds).- Returns:
- last audio timecode written through this publisher (millseconds).
 
 - 
getLastGapAudioTimecodepublic long getLastGapAudioTimecode() Get gap time from last audio timecode.- Returns:
- gap time from audio timecode written throughtime this publisher (millseconds).
 
 - 
getLastVideoTimecodepublic long getLastVideoTimecode() Get last video timecode written through this publisher (millseconds).- Returns:
- last video timecode written through this publisher (millseconds).
 
 - 
getLastGapVideoTimecodepublic long getLastGapVideoTimecode() Get gap time from last video timecode.- Returns:
- gap time from video timecode written through this publisher (millseconds).
 
 - 
getLastDataTimecodepublic long getLastDataTimecode() Get last data timecode written through this publisher (millseconds).- Returns:
- last data timecode written through this publisher (millseconds).
 
 - 
isPublishDataEventspublic boolean isPublishDataEvents() 
 - 
setPublishDataEventspublic void setPublishDataEvents(boolean publishDataEvents) 
 
- 
 
-