FlvWriter Class |
Namespace: StreamCoders.Container
The FlvWriter type exposes the following members.
Name | Description | |
---|---|---|
CompatibilityMode | ||
IsSeekable |
Name | Description | |
---|---|---|
AddTrack | ||
Dispose | Releases all resources used by the FlvWriter | |
Dispose(Boolean) | Releases the unmanaged resources used by the FlvWriter and optionally releases the managed resources | |
EndTrack | ||
Init(Stream) | ||
Init(String) | ||
WriteTrack |
Name | Description | |
---|---|---|
Copy | Overloaded.
Creates a copy of the object.
(Defined by ObjectExtensions.) | |
Copy(Object) | Overloaded.
Creates a deep copy of the object using the supplied object as a target for the copy operation.
(Defined by ObjectExtensions.) |
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(); } }