MediaSuite.NET Sample code

Using MP4Writer

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();
        }
    }
}