Class FLVUtils

Object
com.wowza.util.FLVUtils

public final class FLVUtils extends Object

FLVUtils: utility for reading and writing .flv files.

  • Field Details

    • CLASS

      public static final Class<FLVUtils> CLASS
    • CLASSNAME

      public static final String CLASSNAME
      See Also:
    • FLV_CHUNKHEADER_ITYPE

      public static final int FLV_CHUNKHEADER_ITYPE
      Heaeder values: packet type
      See Also:
    • FLV_CHUNKHEADER_ISIZE

      public static final int FLV_CHUNKHEADER_ISIZE
      Header values: packet size
      See Also:
    • FLV_CHUNKHEADER_ITIMECODE

      public static final int FLV_CHUNKHEADER_ITIMECODE
      Header values: timecode (milliseconds)
      See Also:
    • FLV_CHUNKHEADER_FIRSTBYTE

      public static final int FLV_CHUNKHEADER_FIRSTBYTE
      Header values: first byte of packet data
      See Also:
    • FLV_CHUNKHEADER_SECONDBYTE

      public static final int FLV_CHUNKHEADER_SECONDBYTE
      Header values: second byte of packet data
      See Also:
    • FLV_CHUNKHEADER_HEADERSIZE

      public static final int FLV_CHUNKHEADER_HEADERSIZE
      Size of packet header (byte[])
      See Also:
    • FLV_CHUNKHEADER_BUFFERSIZE

      public static final int FLV_CHUNKHEADER_BUFFERSIZE
      Size of temporary buffer needed for flv reading (byte[])
      See Also:
    • FLV_CHUNKHEADER_VALUESIZE

      public static final int FLV_CHUNKHEADER_VALUESIZE
      Size of header values array (long[])
      See Also:
    • FLV_UFRAME

      public static final int FLV_UFRAME
      Unknown video frame type
      See Also:
    • FLV_KFRAME

      public static final int FLV_KFRAME
      Key video frame type
      See Also:
    • FLV_DFRAME

      public static final int FLV_DFRAME
      D video frame type (partial frame based on key frame)
      See Also:
    • FLV_PFRAME

      public static final int FLV_PFRAME
      P video frame type (partial frame based on previous frame)
      See Also:
    • FLV_TCINDEXAUDIO

      public static final int FLV_TCINDEXAUDIO
      See Also:
    • FLV_TCINDEXVIDEO

      public static final int FLV_TCINDEXVIDEO
      See Also:
    • FLV_TCINDEXDATA

      public static final int FLV_TCINDEXDATA
      See Also:
    • METADATAFILTER_NONE

      public static final long METADATAFILTER_NONE
      See Also:
    • METADATAFILTER_REMOVE_OBJS

      public static final long METADATAFILTER_REMOVE_OBJS
      See Also:
  • Constructor Details

    • FLVUtils

      public FLVUtils()
  • Method Details

    • streamCodecToString

      public static String streamCodecToString(int codec)
      Get a printable string representation of the stream codecs defined as IVHost.CODEC_STREAM_*
      Parameters:
      codec - codec id defined IVHost.CODEC_STREAM_*
      Returns:
      codec name
    • audioCodecStringToId

      public static int audioCodecStringToId(String codecString)
      Parse a string to get the codec ID defined by IVHost.CODEC_AUDIO_*
      Parameters:
      codecString - codec string
      Returns:
      codec ID
    • videoCodecToMetaDataString

      public static String videoCodecToMetaDataString(int codec)
      Get a printable string representation of the video codecs defined as IVHost.CODEC_VIDEO_* as the string used in the onMetaData event
      Parameters:
      codec - codec id defined IVHost.CODEC_VIDEO_*
      Returns:
      codec name
    • videoCodecToMetaDataString

      public static String videoCodecToMetaDataString(int codec, int codecVersion)
      Get a printable string representation of the video codecs defined as IVHost.CODEC_VIDEO_* as the string used in the onMetaData event
      Parameters:
      codec - codec id defined IVHost.CODEC_VIDEO_*
      codecVersion - codec version
      Returns:
      metadata string
    • audioCodecToMetaDataString

      public static String audioCodecToMetaDataString(int codec)
      Get a printable string representation of the audio codecs defined as IVHost.CODEC_AUDIO_* as the string used in the onMetaData event
      Parameters:
      codec - codec id defined IVHost.CODEC_AUDIO_*
      Returns:
      codec name
    • audioCodecToString

      public static String audioCodecToString(int codec)
      Get a printable string representation of the audio codecs defined as IVHost.CODEC_AUDIO_*
      Parameters:
      codec - codec id defined IVHost.CODEC_AUDIO_*
      Returns:
      codec name
    • videoCodecStringToCodecVersion

      public static int videoCodecStringToCodecVersion(String codecString)
      Parse a string to get the codec version defined by IVHost.CODEC_VIDEO_VERSION_*
      Parameters:
      codecString -
      Returns:
      codec version string
    • videoCodecStringToId

      public static int videoCodecStringToId(String codecString)
      Parse a string to get the codec ID defined by IVHost.CODEC_VIDEO_*
      Parameters:
      codecString - codec string
      Returns:
      codec ID
    • videoCodecToString

      public static String videoCodecToString(int codec)
      Get a printable string representation of the video codecs defined as IVHost.CODEC_VIDEO_*
      Parameters:
      codec - codec id defined IVHost.CODEC_VIDEO_*
      Returns:
      codec name
    • videoCodecToString

      public static String videoCodecToString(int codec, int codecVersion)
    • frameTypeToString

      public static String frameTypeToString(int frameType)
    • getFrameType

      public static int getFrameType(int[] values)
      Given the headers values (including first byte of the packet), determine the type of video frame (FLV_*FRAME)
      Parameters:
      values - header values
      Returns:
      type of video frame (FLV_*FRAME)
    • getFrameType

      public static int getFrameType(int value)
      Given the first byte of a video packet, determine the frame type (FLV_*FRAME)
      Parameters:
      value - first byte of packet
      Returns:
      type of video frame (FLV_*FRAME)
    • getAudioCodec

      public static int getAudioCodec(int value)
      Return the codec portion of the first byte of an audio packet. Return should be one of IVHost.CODEC_AUDIO_*
      Parameters:
      value - first byte of audio packet
      Returns:
      codec id
    • getVideoCodec

      public static int getVideoCodec(int value)
      Return the codec portion of the first byte of an video packet. Return should be one of IVHost.CODEC_VIDEO_*
      Parameters:
      value - first byte of audio packet
      Returns:
      codec id
    • getFrameType

      public static int getFrameType(byte value)
      Given the first byte of a video packet, determine the frame type (FLV_*FRAME)
      Parameters:
      value - first byte of packet
      Returns:
      type of video frame (FLV_*FRAME)
    • readChunk

      public static AMFPacket readChunk(InputStream is)
      Read a packets worth of .flv data from an InputStream and return as an AMFPacket
      Parameters:
      is - InputStream
      Returns:
      AMFPacket of data or null if unsuccessful or end of file
    • readChunk

      public static AMFPacket readChunk(DataInput is)
      Read a packets worth of .flv data from an InputStream and return as an AMFPacket
      Parameters:
      is - InputStream
      Returns:
      AMFPacket of data or null if unsuccessful or end of file
    • readPrevChunkHeader

      public static void readPrevChunkHeader(RandomAccessFile is, byte[] buffer, int[] values)
      Back up one packet from current position in the file and read the packet header. This includes reading the first byte of the packet data. The file pointer will be positioned at the first byte of the packet data. values[FLV_CHUNKHEADER_ITYPE] will be set to 0x7f if failure or start of file.
      Parameters:
      is - RandomAccessFile
      buffer - temporary buffer byte[FLV_CHUNKHEADER_BUFFERSIZE]
      values - header values long[FLV_CHUNKHEADER_VALUESIZE]
    • readChunkHeader

      public static void readChunkHeader(RandomAccessFile is, byte[] buffer, int[] values)
      Read packet header. This includes reading the first byte of the packet data. The file pointer will be positioned at the first byte of the packet data. values[FLV_CHUNKHEADER_ITYPE] will be set to 0x7f if failure or end of file.
      Parameters:
      is - RandomAccessFile
      buffer - temporary buffer byte[FLV_CHUNKHEADER_BUFFERSIZE]
      values - header values long[FLV_CHUNKHEADER_VALUESIZE]
    • readHeader

      public static boolean readHeader(InputStream is)
      Read file header. Return true if successful. Basically this just skips first 13 bytes in file.
    • readHeader

      public static boolean readHeader(DataInput is)
      Read file header. Return true if successful. Basically this just skips first 13 bytes in file.
    • writeShortHeader

      public static void writeShortHeader(OutputStream ds)
      Write just the FLV file header (without the metadata packet)
      Parameters:
      ds - OutputStream
    • writeShortHeader

      public static void writeShortHeader(DataOutput ds)
    • writeHeader

      public static void writeHeader(OutputStream ds, double duration, Map extraMetadata)
      Write file header including onMetaData packet.
      Parameters:
      ds - OutputStream
      duration - duration of .flv file in seconds
      extraMetadata - Map of name/value pairs of metadata that will be appended to the onMetaData block
    • writeHeader

      public static void writeHeader(OutputStream ds, double duration, int audiocodecid, int videocodecid, String createdBy, Map extraMetadata)

      Write file header including onMetaData packet.

      With this method you can provide a Map of metadata to write to the file. This map can include a mixture of simple types like: int, long, String, boolean. These types will be wrapped in AMFData classes before they are written to the file. This map can also contain AMFData items. For example if you wanted to insert and array of cuePoints the code would look like:

      Map extraMetadata = new HashMap();
      
      AMFDataArray amfArray = new AMFDataArray();
      for(int i=0;i<numberOfCuePoints;i++)
      {
              AMFDataObj amfObj = new AMFDataObj();
              amfObj.put("type", new AMFDataItem("event"));
              amfObj.put("time", new AMFDataItem((double)timecode/1000.0));
              amfObj.put("name", new AMFDataItem("myname"));
              amfArray.add(amfObj);
      }
      
      extraMetadata.put("cuePoints", amfArray);
      
      Parameters:
      ds - OutputStream
      duration - duration of .flv file in seconds
      audiocodecid - audio codec ID see IVHost.CODEC_AUDIO_* (-1 for now audio)
      videocodecid - video codec ID see IVHost.CODEC_VIDEO_* (-1 for now video)
      createdBy - created by string (null for empty)
      extraMetadata - Map of name/value pairs of metadata that will be appended to the onMetaData block
    • writeChunk

      public static com.wowza.wms.mediawriter.MediaWriterStatus writeChunk(OutputStream ds, ByteBuffer data, int size, long timecode, byte type)
      Write a packets worth of data.
      Parameters:
      ds - OutputStream
      data - packet data
      size - size of the packet
      timecode - timecode (milliseconds)
      type - type of packet IVHost.CONTENTTYPE_*
    • writeChunk

      public static com.wowza.wms.mediawriter.MediaWriterStatus writeChunk(DataOutput ds, ByteBuffer data, int size, long timecode, byte type)
    • interleavePackets

      public static List interleavePackets(List audioPackets, List videoPackets, List dataPackets, List audioTCs, List videoTCs, List dataTCs, long[] currentTCs)
      This is a utility function primarily used for IMediaWriters. It is a way of taking the discrete audio/video/data packets and timecodes and interleaving them into a single list of AMFPacket objects. The currentTCs array is an array of longs containing the last timecode for each of the packet types FLV_TCINDEX* (long[3]). This array will be used to calculate the absolute timecode for a given packet. For example if the relative timecode for an audio packet is 26 and the currentTCs value for the audio channel is 1003 then the absolute timecode for that packet will be 1029. The currentTCs array will be updated after this call to reflect the absolute timecode of the last packet processed of each type.
      Parameters:
      audioPackets - list of audio packets (ByteBuffer)
      videoPackets - list of video packets (ByteBuffer)
      dataPackets - list of data packets (ByteBuffer)
      audioTCs - list of relative audio timecodes (Long)
      videoTCs - list of relative video timecodes (Long)
      dataTCs - list of relative data timecodes (Long)
      currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned in this same array.
      Returns:
      List of AMFPacket objects sorted by timecodes
    • interleavePackets

      public static List<AMFPacket> interleavePackets(List audioPackets, List videoPackets, List dataPackets, List audioTCs, List videoTCs, List dataTCs, List dataTypes, long[] currentTCs)
      This is a utility function primarily used for IMediaWriters. It is a way of taking the discrete audio/video/data packets and timecodes and interleaving them into a single list of AMFPacket objects. The currentTCs array is an array of longs containing the last timecode for each of the packet types FLV_TCINDEX* (long[3]). This array will be used to calculate the absolute timecode for a given packet. For example if the relative timecode for an audio packet is 26 and the currentTCs value for the audio channel is 1003 then the absolute timecode for that packet will be 1029. The currentTCs array will be updated after this call to reflect the absolute timecode of the last packet processed of each type.
      Parameters:
      audioPackets - list of audio packets (ByteBuffer)
      videoPackets - list of video packets (ByteBuffer)
      dataPackets - list of data packets (ByteBuffer)
      audioTCs - list of relative audio timecodes (Long)
      videoTCs - list of relative video timecodes (Long)
      dataTCs - list of relative data timecodes (Long)
      dataTypes - list of integer packets types (IVHost.CONTENTTYPE_DATA0, IVHost.CONTENTTYPE_DATA3) - if null assumed to be IVHost.CONTENTTYPE_DATA0
      currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned in this same array.
      Returns:
      List of AMFPacket objects sorted by timecodes
    • writePackets

      public static void writePackets(OutputStream ds, List packetList, long tcOffset)
      Write audio/video/data packets to an .flv file. They will be written in the packetList order.
      Parameters:
      ds - OutputStream
      packetList - List of AMFPacket objects
      tcOffset - timecode offset
    • writePackets

      public static void writePackets(OutputStream ds, List audioPackets, List videoPackets, List dataPackets, List audioTCs, List videoTCs, List dataTCs, long[] currentTCs)
      Write a bunch of packets to .flv file all at once. The packets will be sorted by timecode as written
      Parameters:
      ds - OutputStream
      audioPackets - list of audio packets (ByteBuffer)
      videoPackets - list of video packets (ByteBuffer)
      dataPackets - list of data packets (ByteBuffer)
      audioTCs - list of relative audio timecodes (Long)
      videoTCs - list of relative video timecodes (Long)
      dataTCs - list of relative data timecodes (Long)
      currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned in this same array.
    • writePackets

      public static void writePackets(OutputStream ds, List audioPackets, List videoPackets, List dataPackets, List audioTCs, List videoTCs, List dataTCs, List dataTypes, long[] currentTCs)
      Write a bunch of packets to .flv file all at once. The packets will be sorted by timecode as written
      Parameters:
      ds - OutputStream
      audioPackets - list of audio packets (ByteBuffer)
      videoPackets - list of video packets (ByteBuffer)
      dataPackets - list of data packets (ByteBuffer)
      audioTCs - list of relative audio timecodes (Long)
      videoTCs - list of relative video timecodes (Long)
      dataTCs - list of relative data timecodes (Long)
      dataTypes - list of integer packets types (IVHost.CONTENTTYPE_DATA0, IVHost.CONTENTTYPE_DATA3) - if null assumed to be IVHost.CONTENTTYPE_DATA0
      currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned in this same array.
    • writePackets

      public static void writePackets(OutputStream ds, List audioPackets, List videoPackets, List dataPackets, List audioTCs, List videoTCs, List dataTCs, List dataTypes, long[] currentTCs, com.wowza.util.IFLVWriterAdjustTimecode dataPacketTimecodeAdjuster)
      Write a bunch of packets to .flv file all at once. The packets will be sorted by timecode as written
      Parameters:
      ds - OutputStream
      audioPackets - list of audio packets (ByteBuffer)
      videoPackets - list of video packets (ByteBuffer)
      dataPackets - list of data packets (ByteBuffer)
      audioTCs - list of relative audio timecodes (Long)
      videoTCs - list of relative video timecodes (Long)
      dataTCs - list of relative data timecodes (Long)
      dataTypes - list of integer packets types (IVHost.CONTENTTYPE_DATA0, IVHost.CONTENTTYPE_DATA3) - if null assumed to be IVHost.CONTENTTYPE_DATA0
      currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned
      dataPacketTimecodeAdjuster - class that implements the IFLVWriterAdjustTimecode interface for adjusting timecodes in this same array.
    • adjustFirstPacketTCs

      public static long adjustFirstPacketTCs(List audioTCs, List videoTCs, List dataTCs)
      Align list of timecode for each data type. Assume first entry in each list is absolute timecode. When done lowest entry in three lists will be zero and other lists will be offset accordingly.
      Parameters:
      audioTCs - list of audio timecodes
      videoTCs - list of video timecodes
      dataTCs - list of data timecodes
      Returns:
      lowest of three absolute timecodes
    • writeDuration

      public static void writeDuration(File file, double duration)
      Write the duration to an existing .flv file. This routine will hunt through the .flv file for the onMetaData packet and the duration metadata. It will rewrite the value if found. If not found it will do nothing.
      Parameters:
      file - .flv file
      duration - new duration value (seconds)
    • getLastTC

      public static long getLastTC(File file)
      Get the duration of an .flv file. This routine will find the onMetaData packet and the duration metadata and return the value. If not found it will read the last packet in the file and return the timecode of that packet.
      Parameters:
      file -
      Returns:
      duration (milliseconds)
    • isVideoKeyFrame

      public static boolean isVideoKeyFrame(AMFPacket packet)
      Returns true if the packet is a video key frame
      Parameters:
      packet - packet
      Returns:
      true if is video key frame
    • isVideoCodecConfig

      public static boolean isVideoCodecConfig(int firstByte, int secondByte)
      Returns true if the packet is a video codec config packet
      Parameters:
      firstByte - first byte of packet
      secondByte - second byte of packet
      Returns:
      true if video codec
    • isVideoCodecConfig

      public static boolean isVideoCodecConfig(AMFPacket packet)
      Returns true if the packet is a video codec config packet
      Parameters:
      packet -
      Returns:
      true if the packet is a video codec config packet
    • isVideoCodecConfig

      public static boolean isVideoCodecConfig(ByteBuffer buffer)
      Returns true if the packet is a video codec config packet
      Parameters:
      buffer - packet data
      Returns:
      true if the packet is a video codec config packet
    • isAudioCodecConfig

      public static boolean isAudioCodecConfig(AMFPacket packet)
      Returns true if the packet is a audio codec config packet
      Parameters:
      packet -
      Returns:
      true if the packet is a audio codec config packet
    • isAudioCodecConfig

      public static boolean isAudioCodecConfig(ByteBuffer buffer)
      Returns true if the packet is a audio codec config packet
      Parameters:
      buffer - packet data
      Returns:
      true if the packet is a audio codec config packet
    • getAudioMP3Layer

      public static int getAudioMP3Layer(AMFPacket packet)
      Audio marked as MP3 is really MPEG1 Layer 1-3. Only MPEG1 Layer 3 is truely MP3. This function will return the layer number for this packet.
      Parameters:
      packet - amf packet
      Returns:
      layer number
    • getAudioCodec

      public static int getAudioCodec(AMFPacket packet)
      Get the codec id for this audio packet. Returns IVHost.CODEC_AUDIO_UNKNOWN is unknown or not audio packet
      Parameters:
      packet - packet
      Returns:
      codec id IVHost.CODEC_AUDIO_*
    • getVideoCodec

      public static int getVideoCodec(AMFPacket packet)
      Get the codec id for this video packet. Returns IVHost.CODEC_VIDEO_UNKNOWN is unknown or not video packet
      Parameters:
      packet - packet
      Returns:
      codec id IVHost.CODEC_VIDEO_*
    • getVideoFrameType

      public static int getVideoFrameType(AMFPacket packet)
    • getPtsOffSetFromDts

      public static int getPtsOffSetFromDts(AMFPacket packet)
      Get the timecode offset in milliseconds between the PTS and DTS for this frame.
      Parameters:
      packet - AMFPacket
      Returns:
      PTS timecode offset from DTS in milliseconds (can be negative)
    • getVideoTimecodeOffset

      public static int getVideoTimecodeOffset(AMFPacket packet)
      Get the timecode offset in milliseconds between the PTS and DTS for this frame.
      Parameters:
      packet - AMFPacket
      Returns:
      PTS timecode offset from DTS in milliseconds (can be negative)
    • getPtsOffSetFromDts

      public static int getPtsOffSetFromDts(byte[] buffer)
      Get the timecode offset in milliseconds between the PTS and DTS for this frame.
      Parameters:
      buffer - video packet buffer
      Returns:
      PTS timecode offset from DTS in milliseconds (can be negative)
    • getVideoTimecodeOffset

      public static int getVideoTimecodeOffset(byte[] buffer)
      Get the timecode offset in milliseconds between the PTS and DTS for this frame.
      Parameters:
      buffer - video packet buffer
      Returns:
      PTS timecode offset from DTS in milliseconds (can be negative)
    • isVideoKeyFrame

      public static boolean isVideoKeyFrame(ByteBuffer buffer)
      Returns true if the packet is a video key frame
      Parameters:
      buffer - packet data (only need first two bytes of data)
      Returns:
      true if is video key frame
    • isVideoKeyFrame

      public static boolean isVideoKeyFrame(byte[] buffer)
      Returns true if the packet is a video key frame
      Parameters:
      buffer - packet data (only need first two bytes of data)
      Returns:
      true if is video key frame
    • isVideoKeyFrame

      public static boolean isVideoKeyFrame(int[] chunkHeaderValues)
      Returns true if the packet is a video key frame
      Parameters:
      chunkHeaderValues - chunk header values returned by FLVUtils.readChunkHeader
      Returns:
      true if is video key frame
    • updateOnCuePointTimecode

      public static AMFPacket updateOnCuePointTimecode(AMFPacket packet, long timecode)
    • updateOnCuePointTimecode

      public static ByteBuffer updateOnCuePointTimecode(ByteBuffer data, int dataType, long timecode)
    • isOnMetadata

      public static boolean isOnMetadata(byte[] dataDataBytes)
    • isOnMetadataPacket

      public static boolean isOnMetadataPacket(AMFPacket packet)
      Returns true if packet is onMetaData or [@setDataFrame, onMetaData] data packet.
      Parameters:
      packet - packet
      Returns:
      true if onMetaData packet
    • getOnMetadataData

      public static OnMetadataBasic getOnMetadataData(AMFPacket metaDataPacket)
    • getHeaderFlags

      public static byte getHeaderFlags(File file)
    • writeHeaderFlags

      public static void writeHeaderFlags(File file, byte newFlags)
    • modifyOnMetadataEvent

      public static byte[] modifyOnMetadataEvent(byte[] buffer, long flags, List<String> itemsToRemove, Map<String,AMFData> itemsToAdd)
      Modifies onMetadata event to remove or add items
      Parameters:
      buffer - byte buffer with onMetadata event serialized
      flags - flags to control what gets removed (see METADATAFILTER_*)
      itemsToRemove - list of names of fields to remove
      itemsToAdd - map of items to add
      Returns:
      serialized onMetadata event