Class Publisher

Object
com.wowza.wms.stream.publish.Publisher

public class Publisher extends Object

Publisher: 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 Details

    • createInstance

      public static Publisher createInstance(IVHost vhost, String applicationName)
    • createInstance

      public static Publisher createInstance(IVHost vhost, String applicationName, String appInstanceName)
    • createInstance

      public static Publisher createInstance(IApplicationInstance appInstance)
    • getStream

      public IMediaStream getStream()
      Get the media stream object
      Returns:
      media stream object
    • getStreamType

      public String getStreamType()
    • setStreamType

      public void setStreamType(String streamType)
      Set the stream type (default live)
      Parameters:
      streamType - stream type
    • publish

      public void publish(String streamName)
      Publish a stream (null to stop publishing)
      Parameters:
      streamName - stream name
    • getFileExtension

      public String getFileExtension()
      Get the file extension (default flv)
      Returns:
      file extension
    • setFileExtension

      public void setFileExtension(String fileExtension)
      Set the file extension
      Parameters:
      fileExtension - file extension
    • getAppInstance

      public IApplicationInstance getAppInstance()
    • unpublish

      public void unpublish()
    • createStream

      public void createStream()
      Create underlying IMediaStream object if not already created
    • unregisterStreamFromStreamMap

      public void unregisterStreamFromStreamMap()
      Remove the stream from MediaStreamMap
    • publish

      public 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)
    • addVideoData

      public void addVideoData(byte[] data, long timecode)
      Add video data
      Parameters:
      data - data
      timecode - absolute timecode (milliseconds)
    • addVideoData

      public void addVideoData(byte[] data, int len, long timecode)
      Add video data
      Parameters:
      data - data
      len - data length
      timecode - absolute timecode (milliseconds)
    • addVideoData

      public 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)
    • addVideoData

      public void addVideoData(byte[] data, int offset, int len, long timecode, Map<String,IAMFPacketExtraData> extraData)
      Add video data
      Parameters:
      data - data
      offset - offset
      len - data length
      timecode - absolute timecode (milliseconds)
      extraData - extra data
    • startVideoData

      public void startVideoData(int len, long timecode)
    • startVideoData

      public void startVideoData(int len, long timecode, Map<String,IAMFPacketExtraData> extraData)
    • addVideoDataInc

      public void addVideoDataInc(byte[] data, int offset, int len)
    • startAudioData

      public void startAudioData(int len, long timecode)
    • startAudioData

      public void startAudioData(int len, long timecode, Map<String,IAMFPacketExtraData> extraData)
    • addAudioDataInc

      public void addAudioDataInc(byte[] data, int offset, int len)
    • addAudioData

      public void addAudioData(byte[] data, long timecode)
      Add audio data
      Parameters:
      data - data
      timecode - absolute timecode (milliseconds)
    • addAudioData

      public void addAudioData(byte[] data, int len, long timecode)
      Add audio data
      Parameters:
      data - data
      len - data length
      timecode - absolute timecode (milliseconds)
    • addAudioData

      public void addAudioData(byte[] data, int offset, int len, long timecode)
    • addAudioData

      public void addAudioData(byte[] data, int offset, int len, long timecode, Map<String,IAMFPacketExtraData> extraData)
      Add audio data
      Parameters:
      data - data
      len - data length
      offset - offset
      timecode - absolute timecode (milliseconds)
    • addDataData

      public void addDataData(byte[] data, long timecode)
      Add metadata
      Parameters:
      data - data
      timecode - absolute timecode (milliseconds)
    • addDataData

      public void addDataData(byte[] data, int len, long timecode)
      Add metadata
      Parameters:
      data - data
      len - data length
      timecode - absolute timecode (milliseconds)
    • addDataData

      public void addDataData(byte[] data, int offset, int len, long timecode)
    • addDataData

      public void addDataData(byte[] data, int offset, int len, long timecode, Map<String,IAMFPacketExtraData> extraData)
      Add metadata
      Parameters:
      data - data
      offset - offset
      len - data length
      timecode - absolute timecode (milliseconds)
    • startDataData

      public void startDataData(int len, long timecode)
    • startDataData

      public void startDataData(int len, long timecode, Map<String,IAMFPacketExtraData> extraData)
    • addDataDataInc

      public void addDataDataInc(byte[] data, int offset, int len)
    • flush

      public void flush()
      Flush the packets from the input buffer to the output buffer
    • close

      public void close()
      Close the publisher
    • getMaxTimecode

      public long getMaxTimecode()
      Highest timecode written through this publisher (millseconds).
      Returns:
      highest timecode written through this publisher (millseconds)
    • getLastAudioTimecode

      public long getLastAudioTimecode()
      Get last audio timecode written through this publisher (millseconds).
      Returns:
      last audio timecode written through this publisher (millseconds).
    • getLastGapAudioTimecode

      public long getLastGapAudioTimecode()
      Get gap time from last audio timecode.
      Returns:
      gap time from audio timecode written throughtime this publisher (millseconds).
    • getLastVideoTimecode

      public long getLastVideoTimecode()
      Get last video timecode written through this publisher (millseconds).
      Returns:
      last video timecode written through this publisher (millseconds).
    • getLastGapVideoTimecode

      public long getLastGapVideoTimecode()
      Get gap time from last video timecode.
      Returns:
      gap time from video timecode written through this publisher (millseconds).
    • getLastDataTimecode

      public long getLastDataTimecode()
      Get last data timecode written through this publisher (millseconds).
      Returns:
      last data timecode written through this publisher (millseconds).
    • isPublishDataEvents

      public boolean isPublishDataEvents()
    • setPublishDataEvents

      public void setPublishDataEvents(boolean publishDataEvents)