This sample demonstrates using the AVIWriter with MPEG-4 and MP3 codecs.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StreamCoders;
using StreamCoders.Encoder;
using StreamCoders.Writer;
using StreamCoders.Wave;
using StreamCoders.Devices;
using System.Drawing.Imaging;
using System.Drawing;
using StreamCoders.Tools;
namespace AVIWriterTest
{
class Program
{
static void Main(string[] args)
{
double framerate = 10.0;
CamCapture cam = new CamCapture();
System.Collections.Generic.List<string> devices = cam.GetDeviceList();
cam.DeviceName = devices[0];
cam.Start();
int width = cam.Metrics.Width;
int height = cam.Metrics.Height;
MPEG4Encoder venc = new MPEG4Encoder();
venc.SetInputResolution((uint)width, (uint)height);
venc.Framerate = framerate;
venc.IFrameFrequency = 10;
venc.Init();
int audioChannels = 1;
int audioSampleFreq = 44100;
int audioBitrate = 128000;
int audioBitsPerSample = 16;
MP3Encoder aenc = new MP3Encoder();
aenc.InputBitsPerSample = audioBitsPerSample;
aenc.BitrateMode = BitrateModes.CONSTANT_BITRATE;
aenc.OutputBitrate = audioBitrate;
aenc.InputChannels = audioChannels;
aenc.InputSampleFrequency = audioSampleFreq;
aenc.AdvancedNoiseShaping = false;
aenc.LowPassFilter = false;
aenc.MPEG1Upsample = true;
aenc.StereoMode = StereoModes.MONO;
aenc.Init();
WaveInput win = new WaveInput();
win.BitsPerSample = audioBitsPerSample;
win.Channels = audioChannels;
win.SampleRate = audioSampleFreq;
win.OpenDevice();
win.Start();
AVIWriter writer = new AVIWriter();
writer.Filename = "c:\\avfile.avi";
string fname = writer.Filename;
writer.Init();
TrackInfo vtrack = new TrackInfo();
vtrack.TrackCategory = TrackCategories.VIDEO;
vtrack.TrackType = TrackTypes.MPEG4V;
vtrack.Video = new VideoTrack();
vtrack.Video.Framerate = framerate;
vtrack.Video.Width = width;
vtrack.Video.Height = height;
vtrack = writer.AddTrack(vtrack);
TrackInfo atrack = new TrackInfo();
atrack.TrackCategory = TrackCategories.AUDIO;
atrack.TrackType = TrackTypes.MP3;
atrack.Audio = new AudioTrack();
atrack.Audio.Bitrate = audioBitrate;
atrack.Audio.BitsPerSample = audioBitsPerSample;
atrack.Audio.SampleFrequency = audioSampleFreq;
atrack.Audio.BitsPerSample = audioBitsPerSample;
atrack.Audio.Channels = audioChannels;
atrack = writer.AddTrack(atrack);
win.ClearBuffers();
int startTicker = System.Environment.TickCount;
double frameduration = 1000.0 / framerate;
int absoluteTicker = System.Environment.TickCount;
int videoEncoded = 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));
MediaPackage mp = new MediaPackage();
mp.Buffer = cpic;
bool writeres = writer.WriteTrack(vtrack, mp, venc.LastEncodedFrameType == FrameTypes.I_FRAME? true:false);
if (writeres == false)
Console.WriteLine("Unable to write to track");
videoEncoded++;
}
}
if (win.SamplesAvailable)
{
Console.WriteLine("Preparing Audio Frame");
byte[] samples = win.GetAllData();
while (true)
{
byte[] csamples = aenc.Encode(samples);
samples = null;
if (csamples != null)
{
MediaPackage mp = new MediaPackage();
mp.Buffer = csamples;
bool writeres = writer.WriteTrack(atrack, mp, false);
if (writeres == false)
Console.WriteLine("Unable to write to track");
}
else
break;
}
}
}
writer.EndTrack(vtrack);
writer.EndTrack(atrack);
writer.Dispose();
}
}
}