Class FLVWriter

java.lang.Object
org.red5.io.flv.impl.FLVWriter
All Implemented Interfaces:
ITagWriter

public class FLVWriter extends Object implements ITagWriter
A Writer is used to write the contents of a FLV file
Author:
The Red5 Project, Dominick Accattato (daccattato@gmail.com), Luke Hubbard, Codegent Ltd (luke@codegent.com), Tiago Jacobs (tiago@imdt.com.br), Paul Gregoire (mondain@gmail.com)
  • Field Details

    • log

      private static org.slf4j.Logger log
    • HEADER_LENGTH

      private static final int HEADER_LENGTH
      Length of the flv header in bytes
      See Also:
    • TAG_HEADER_LENGTH

      private static final int TAG_HEADER_LENGTH
      Length of the flv tag in bytes
      See Also:
    • DEFAULT_STREAM_ID

      private static final byte[] DEFAULT_STREAM_ID
      For now all recorded streams carry a stream id of 0.
    • executor

      private ExecutorService executor
      Executor for tasks within this instance
    • flv

      private static IFLV flv
      FLV object
    • bytesWritten

      private AtomicLong bytesWritten
      Number of bytes written
    • offset

      private int offset
      Position in file
    • timeOffset

      private int timeOffset
      Position in file
    • audioCodecId

      private volatile int audioCodecId
      Id of the audio codec used.
    • videoCodecId

      private volatile int videoCodecId
      Id of the video codec used.
    • audioConfigWritten

      private AtomicBoolean audioConfigWritten
      If audio configuration data has been written
    • videoConfigWritten

      private AtomicBoolean videoConfigWritten
      If video configuration data has been written
    • soundRate

      private volatile int soundRate
      Sampling rate
    • soundSize

      private volatile int soundSize
      Size of each audio sample
    • soundType

      private volatile boolean soundType
      Mono (0) or stereo (1) sound
    • append

      private boolean append
      Are we appending to an existing file?
    • duration

      private int duration
      Duration of the file.
    • videoDataSize

      private int videoDataSize
      Size of video data
    • audioDataSize

      private int audioDataSize
      Size of audio data
    • fileChannel

      private SeekableByteChannel fileChannel
      Flv output destination.
    • dataChannel

      private SeekableByteChannel dataChannel
      Destination to which stream data is stored without an flv header.
    • filePath

      private String filePath
    • lock

      private final Semaphore lock
    • lastTagSize

      private volatile int lastTagSize
    • postProcessors

      private LinkedList<IPostProcessor> postProcessors
    • finalized

      private AtomicBoolean finalized
    • recordedDate

      private String recordedDate
    • meta

      private Map<String,?> meta
    • appendOffset

      private long appendOffset
  • Constructor Details

    • FLVWriter

      public FLVWriter(String filePath)
      Creates writer implementation with for a given file
      Parameters:
      filePath - path to existing file
    • FLVWriter

      public FLVWriter(boolean repair, String filePath)
      Creates writer implementation with for a given file
      Parameters:
      repair - repair the .ser file
      filePath - path to existing file
    • FLVWriter

      public FLVWriter(File file, boolean append)
      Creates writer implementation with given file and flag indicating whether or not to append. FLV.java uses this constructor so we have access to the file object
      Parameters:
      file - File output stream
      append - true if append to existing file
    • FLVWriter

      public FLVWriter(Path path, boolean append)
      Creates writer implementation with given file and flag indicating whether or not to append. FLV.java uses this constructor so we have access to the file object
      Parameters:
      path - File output path
      append - true if append to existing file
  • Method Details

    • getMetaData

      private Map<String,?> getMetaData(Path path, int maxTags) throws IOException
      Throws:
      IOException
    • writeHeader

      public void writeHeader() throws IOException
      Writes the header bytes
      Specified by:
      writeHeader in interface ITagWriter
      Throws:
      IOException - Any I/O exception
    • writeTag

      public boolean writeTag(ITag tag) throws IOException
      Writes a Tag object
      Specified by:
      writeTag in interface ITagWriter
      Parameters:
      tag - Tag to write
      Returns:
      true on success, false otherwise
      Throws:
      IOException - I/O exception
    • writeTag

      public boolean writeTag(byte dataType, org.apache.mina.core.buffer.IoBuffer data) throws IOException
      Write a Tag using bytes
      Specified by:
      writeTag in interface ITagWriter
      Parameters:
      dataType - Tag type
      data - Byte data
      Returns:
      true on success, false otherwise
      Throws:
      IOException - I/O exception
    • writeStream

      public boolean writeStream(byte[] b)
      Write a Stream to disk using bytes
      Specified by:
      writeStream in interface ITagWriter
      Parameters:
      b - Array of bytes to write
      Returns:
      true on success, false otherwise
    • createOutputFile

      private void createOutputFile() throws IOException
      Create the stream output file; the flv itself.
      Throws:
      IOException
    • createDataFile

      private void createDataFile() throws IOException
      Create the stream data file.
      Throws:
      IOException
    • createRepairDataFile

      private void createRepairDataFile() throws IOException
      Create the stream data file for repair.
      Throws:
      IOException
    • writeMetadataTag

      private void writeMetadataTag(double duration, int videoCodecId, int audioCodecId) throws IOException, InterruptedException, ExecutionException
      Write "onMetaData" tag to the file.
      Parameters:
      duration - Duration to write in milliseconds.
      videoCodecId - Id of the video codec used while recording.
      audioCodecId - Id of the audio codec used while recording.
      Throws:
      IOException - if the tag could not be written
      ExecutionException
      InterruptedException
    • finalizeFlv

      private long finalizeFlv()
      Finalizes the FLV file.
      Returns:
      bytes transferred
    • readInfoFile

      private static int[] readInfoFile(File tmpFile)
      Read flv file information from pre-finalization file.
      Parameters:
      tmpFile -
      Returns:
      array containing audio codec id, video codec id, and duration
    • updateInfoFile

      private void updateInfoFile()
      Write or update flv file information into the pre-finalization file.
    • close

      public void close()
      Ends the writing process, then merges the data file with the flv file header and metadata.
      Specified by:
      close in interface ITagWriter
    • addPostProcessor

      public void addPostProcessor(IPostProcessor postProcessor)
      Adds a post-process for execution once the instance completes.
      Specified by:
      addPostProcessor in interface ITagWriter
      Parameters:
      postProcessor - an implementation instance of IPostProcessor
    • getFile

      public IStreamableFile getFile()
      Return the file that is written.
      Specified by:
      getFile in interface ITagWriter
      Returns:
      the File to be written
    • setFLV

      public static void setFLV(IFLV flv)
      Setter for FLV object
      Parameters:
      flv - FLV source
    • getOffset

      public int getOffset()
      Return the offset
      Specified by:
      getOffset in interface ITagWriter
      Returns:
      Offset value
    • setOffset

      public void setOffset(int offset)
      Setter for offset
      Parameters:
      offset - Value to set for offset
    • getBytesWritten

      public long getBytesWritten()
      Return the bytes written
      Specified by:
      getBytesWritten in interface ITagWriter
      Returns:
      Number of bytes written
    • setVideoCodecId

      public void setVideoCodecId(int videoCodecId)
    • setAudioCodecId

      public void setAudioCodecId(int audioCodecId)
    • setSoundRate

      public void setSoundRate(int soundRate)
    • setSoundSize

      public void setSoundSize(int soundSize)
    • setSoundType

      public void setSoundType(boolean soundType)
    • setDuration

      public void setDuration(int duration)
    • setVideoDataSize

      public void setVideoDataSize(int videoDataSize)
    • setAudioDataSize

      public void setAudioDataSize(int audioDataSize)
    • repair

      public static boolean repair(String path, Integer audioId, Integer videoId) throws InterruptedException
      Allows repair of flv files if .info and .ser files still exist.
      Parameters:
      path - path to .ser file
      audioId - audio codec id
      videoId - video codec id
      Returns:
      true if conversion was successful
      Throws:
      InterruptedException - Exception on interruption
    • submit

      private Future<?> submit(FLVWriter.FLVFinalizer flvFinalizer)
      Submits a finalizer internally.
      Parameters:
      flvFinalizer -
      Returns:
      Future representing task
    • main

      public static void main(String[] args) throws InterruptedException
      Exposed to allow repair of flv files if .info and .ser files still exist.
      Parameters:
      args - 0: path to .ser file 1: audio codec id 2: video codec id
      Throws:
      InterruptedException - Exception on interruption