unsafe static void ExampleRGB(string filename) { var settings = new BasicEncoderSettings(); settings.Video.Width = 640; settings.Video.Height = 480; settings.Video.Timebase = new Rational(1, 30); settings.Video.Bitrate = 2000000; settings.Audio.SampleRate = 44100; settings.Audio.SampleFormat = BasicSampleFormat.FLTP; using (var enc = new BasicEncoder(filename, settings)) using (var vFrameGen = new BasicVideoFrame(1000, 2000, BasicPixelFormat.GBRP)) using (var vFrameEnc = new BasicVideoFrame(settings.Video.Width, settings.Video.Height, BasicPixelFormat.YUV420P)) using (var rescaler = new BasicRescaler(vFrameGen, vFrameEnc, BasicRescalerFlags.Lanczos)) using (var aFrame = new BasicAudioFrame(settings.Audio.FrameSize == 0 ? 10000 : settings.Audio.FrameSize, settings.Audio.SampleFormat, settings.Audio.ChannelLayout)) { byte * bufR = vFrameGen.GetBuffer(2); byte * bufG = vFrameGen.GetBuffer(1); byte * bufB = vFrameGen.GetBuffer(0); int stride = vFrameGen.GetStride(0); // equal for 1 & 2 float *bufA1 = (float *)aFrame.GetBuffer(0); float *bufA2 = (float *)aFrame.GetBuffer(1); float t = 0; float tInc = (float)(2 * Math.PI * 110.0 / settings.Audio.SampleRate); float tInc2 = tInc / settings.Audio.SampleRate; int aSamples = 0; for (int frameNumber = 0; frameNumber < 5 * settings.Video.Timebase.Den / settings.Video.Timebase.Num; frameNumber++) { for (int y = 0; y < vFrameGen.Height; y++) { for (int x = 0; x < vFrameGen.Width; x++) { bufR[y * stride + x] = (byte)(x + y + frameNumber * 3); bufG[y * stride + x] = (byte)(128 + y + frameNumber * 2); bufB[y * stride + x] = (byte)(64 + x + frameNumber * 5); } } rescaler.RescaleFrame(vFrameGen, vFrameEnc); enc.EncodeFrame(vFrameEnc, frameNumber); while (aSamples < frameNumber * settings.Audio.SampleRate * settings.Video.Timebase.Num / settings.Video.Timebase.Den) { for (int k = 0; k < aFrame.SampleCount; k++) { float sample = (float)Math.Sin(t) * 0.5f; bufA1[k] = sample; bufA2[k] = sample; t += tInc; tInc += tInc2; } enc.EncodeFrame(aFrame, aSamples); aSamples += aFrame.SampleCount; } } } }
public ThreadedEncoder(string filename, BasicEncoderSettings settings, int sourceWidth, int sourceHeight, BasicPixelFormat sourcePixelFormat) { _settings = settings; _encoder = new BasicEncoder(filename, settings); _frameRescaled = new BasicVideoFrame(settings.Video.Width, settings.Video.Height, settings.Video.PixelFormat); for (int i = 0; i < 10; i++) { _framesFree.Enqueue(new VideoFrame(sourceWidth, sourceHeight, sourcePixelFormat)); } _rescaler = new BasicRescaler(sourceWidth, sourceHeight, sourcePixelFormat, settings.Video.Width, settings.Video.Height, settings.Video.PixelFormat, BasicRescalerFlags.FastBilinear); _thread = new Thread(encodingThread); _thread.IsBackground = true; // don't prevent program shutting down if the thread is still running _thread.Start(); }
public void Dispose() { if (_framesFree != null) { foreach (var frame in _framesFree) { frame?.Dispose(); } } _framesFree = null; if (_framesToEncode != null) { foreach (var frame in _framesToEncode) { frame?.Dispose(); } } _framesToEncode = null; _frameRescaled?.Dispose(); _frameRescaled = null; _rescaler?.Dispose(); _rescaler = null; }