This sample demonstrates the use of MP4Writer with MPEG-4 and AAC codecs.
Requirements: Microphone, Webcam
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 StreamCoders.Decoder;
using StreamCoders.Tools;
using System.Drawing;
namespace MP4WriterTest
{
class Program
{
static void Main(string[] args)
{
double framerate = 25;
CamCapture cam = new CamCapture();
System.Collections.Generic.List<string> devices = cam.GetDeviceList();
cam.DeviceName = devices[0]; // Select default camera
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;
AACEncoder aenc = new AACEncoder();
aenc.InputBitsPerSample = audioBitsPerSample;
aenc.OutputBitrate = audioBitrate;
aenc.InputChannels = audioChannels;
aenc.InputSampleFrequency = audioSampleFreq;
aenc.Init();
AACDecoder adec = new AACDecoder();
adec.AudioSource = StreamSources.FILE_OTHER;
adec.BitsPerSample = audioBitsPerSample;
adec.Channels = audioChannels;
adec.SampleRate = audioSampleFreq;
adec.Init();
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();
MP4Writer writer = new MP4Writer();
writer.Filename = "c:\\mp4file.mp4";
string fname = writer.Filename;
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.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 = writer.AddTrack(atrack);
writer.Init();
win.ClearBuffers();
int startTicker = System.Environment.TickCount;
double frameduration = 1000.0 / framerate;
int absoluteTicker = System.Environment.TickCount;
double videoCurrent = 0.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;
mp.startTime = videoCurrent;
mp.endTime = 1.0 / framerate;
bool writeres = writer.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 = writer.WriteTrack(atrack, mp);
if (writeres == false)
Console.WriteLine("Unable to write to audio track.");
}
else
break;
}
}
}
writer.EndTrack(vtrack);
writer.EndTrack(atrack);
writer.Dispose();
}
}
}