Click or drag to resize
FlvWriter Class
FLV Writer for Flash Video Beta.
Supported Codecs: Video: H.264 Baseline Audio: MPEG-4 Audio (AAC)
Inheritance Hierarchy
SystemObject
  StreamCoders.ContainerFlvWriter

Namespace: StreamCoders.Container
Assembly: MediaBase (in MediaBase.dll) Version: 2.0.5.0 (2.0.5.0)
Syntax
public class FlvWriter : IWriter, IDisposable

The FlvWriter type exposes the following members.

Constructors
  NameDescription
Public methodFlvWriter
Initializes a new instance of the FlvWriter class
Top
Properties
Methods
  NameDescription
Public methodAddTrack
Public methodDispose
Releases all resources used by the FlvWriter
Public methodDispose(Boolean)
Releases the unmanaged resources used by the FlvWriter and optionally releases the managed resources
Public methodEndTrack
Public methodInit(Stream)
Public methodInit(String)
Public methodWriteTrack
Top
Extension Methods
  NameDescription
Public Extension MethodCopyOverloaded.
Creates a copy of the object.
(Defined by ObjectExtensions.)
Public Extension MethodCopy(Object)Overloaded.
Creates a deep copy of the object using the supplied object as a target for the copy operation.
(Defined by ObjectExtensions.)
Top
Remarks
Note: The first buffers written to the tracks have to be configuration information for the decoders. See AAC.ConfigParameter and H264Encoder.GetDecoderConfigurationInfo()
Examples
class Program
{
    public static byte[] HexStringToByteArray(String HexString)
    {
        int NumberChars = HexString.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
        {
            bytes[i / 2] = Convert.ToByte(HexString.Substring(i, 2), 16);
        }
        return bytes;
    }

    static void Main(string[] args)
    {
        double framerate = 25;
        CamCapture cam = new CamCapture();
        System.Collections.Generic.List<string> devices = cam.GetDeviceList();
        List<CamMetrics> metrics = cam.SelectDevice(devices[0]);
        cam.SelectMetrics(metrics[0]);
        cam.Start();

        int width = cam.Metrics.Width;
        int height = cam.Metrics.Height;


        H264Encoder venc = new H264Encoder();
        venc.SetInputResolution((uint)width, (uint)height);
        venc.Framerate = framerate;
        venc.IFrameFrequency = 10;
        venc.SimpleInit();

        int audioChannels = 1;
        int audioSampleFreq = 44100;
        int audioBitrate = 128000;
        int audioBitsPerSample = 16;

        AACEncoder aenc = new AACEncoder();
        aenc.InputBitsPerSample = audioBitsPerSample;
        aenc.OutputBitrate = audioBitrate;
        aenc.InputChannels = audioChannels;
        aenc.InputSampleFrequency = audioSampleFreq;
        aenc.OutputFormat = AACFormats.ADIF;

        aenc.SimpleInit();

        AACDecoder adec = new AACDecoder();
        adec.AudioSource = StreamSources.FILE_OTHER;
        adec.BitsPerSample = audioBitsPerSample;
        adec.Channels = audioChannels;
        adec.SampleRate = audioSampleFreq;
        adec.SimpleInit();


        WaveInput win = new WaveInput();
        win.BitsPerSample = audioBitsPerSample;
        win.Channels = audioChannels;
        win.SampleRate = audioSampleFreq;

        win.OpenDevice();
        win.Start();

        WaveOutput wout = new WaveOutput();
        wout.BitsPerSample = audioBitsPerSample;
        wout.Channels = audioChannels;
        wout.SampleRate = audioSampleFreq;
        wout.OpenDevice();



        FLVWriter streamWriter = new FLVWriter();
        streamWriter.Filename = "flvfile.flv";
        string fname = streamWriter.Filename;

        TrackInfo vtrack = new TrackInfo();
        vtrack.TrackCategory = TrackCategory.Video;
        vtrack.Codec = Codec.H264;
        vtrack.Video = new VideoTrack();
        vtrack.Video.Framerate = framerate;
        vtrack.Video.Width = width;
        vtrack.Video.Height = height;

        vtrack = streamWriter.AddAdaptiveTrack(vtrack);

        TrackInfo atrack = new TrackInfo();
        atrack.TrackCategory = TrackCategory.Audio;
        atrack.Codec = Codec.AAC;
        atrack.Audio = new AudioTrack();
        atrack.Audio.Bitrate = 0;
        atrack.Audio.BitsPerSample = audioBitsPerSample;
        atrack.Audio.SampleFrequency = audioSampleFreq;
        atrack.Audio.BitsPerSample = audioBitsPerSample;
        atrack.Audio.Channels = audioChannels;

        atrack = streamWriter.AddAdaptiveTrack(atrack);
        streamWriter.SimpleInit();

        MediaPackage sequenceData = venc.GetDecoderConfigurationInfo();
        if(sequenceData != null)
            streamWriter.WriteTrack(vtrack, sequenceData);

        win.ClearBuffers();

        sequenceData = new MediaPackage();

        sequenceData.PackageType = MediaPackage.PackageTypes.CONFIG;
        sequenceData.OggBuffer = HexStringToByteArray(aenc.ConfigParameter);
        streamWriter.WriteTrack(atrack, sequenceData, true);


        int startTicker = System.Environment.TickCount;
        double frameduration = 1000.0 / framerate;
        int absoluteTicker = System.Environment.TickCount;
        double videoCurrent = 0.0;
        int videoFramesEncoded = 0;
        while (Console.KeyAvailable == false)
        {
            int delta = System.Environment.TickCount - startTicker;
            if (delta > frameduration)
            {
                Console.WriteLine("Preparing Video Frame");
                int deltaError = delta - (int)frameduration;
                startTicker = System.Environment.TickCount - deltaError;
                int absDelta = System.Environment.TickCount - absoluteTicker;
                byte[] pic = cam.GetFrame();
                if (pic != null)
                {
                    byte[] cpic = venc.EncodeToArray(Visuals.Array24Rotate(vtrack.Video.Width, vtrack.Video.Height, pic, RotateFlipType.Rotate180FlipX));

                    videoFramesEncoded++;
                    MediaPackage mp = new MediaPackage();
                    mp.OggBuffer = cpic;
                    mp.startTime = videoCurrent;
                    mp.endTime = 1.0 / framerate;
                    mp.IsKeyFrame = venc.LastEncodedFrameType == FrameTypes.I_FRAME;
                    bool writeres = streamWriter.WriteTrack(vtrack, mp);
                    if (writeres == false)
                        Console.WriteLine("Unable to write to video track");
                    videoCurrent += (1.0 / framerate);
                }
                else
                {
                    Console.WriteLine("failed to compress");
                }

            }
            if (win.SamplesAvailable)
            {
                Console.WriteLine("Preparing Audio Frame");
                byte[] samples = win.GetAllData();
                while (true)
                {
                    MediaPackage mp = aenc.Encode(samples, true);
                    samples = null;             // Loop encoding with null, to retrieve remaining data from encoder.
                    if (mp != null)
                    {
                        bool writeres = streamWriter.WriteTrack(atrack, mp);
                        if (writeres == false)
                            Console.WriteLine("Unable to write to audio track.");
                    }
                    else
                        break;
                }
            }

        }

        streamWriter.EndTrack(vtrack);
        streamWriter.EndTrack(atrack);
        streamWriter.Dispose();
    }
}
See Also

Reference

Writer
SystemIDisposable