Getting Started in C# (advanced example)ByteScout Screen Capturing SDK

The following example shows advanced sample code on how to use Screen Capturer ActiveX in Visual C# .NET to capture video from screen into AVI video file and set video codec, audio codec parameters and other parameters.

Before using the code, click Project and Add Reference.., switch to COM tab and select BytescoutScreenCapturingLib in the list of available ActiveX and COM objects and click OK as shown on the screenshot below:

net add reference to capturerlib
C#
using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using System.Threading;
using System.Runtime.InteropServices;

using BytescoutScreenCapturingLib;

namespace CaptureScreenCSharp
{
    public class Win32Interop
    {
        [DllImport("crtdll.dll")]
        public static extern int _kbhit();
    }

    class Program
    {
        static void Main(string[] args)
        {
            CapturerClass capturer = new CapturerClass();

            if (args.Length < 1)
            {
                usage(capturer);
                return;
            }

            capturer.OutputFileName = args[0];
            capturer.CapturingType = CaptureAreaType.catRegion;
            setParams(args, capturer);

            try
            {
                capturer.Run();
                Console.WriteLine("Starting capture - Hit a key to stop ...");

                string s = capturer.CurrentVideoCodecName;
                Console.WriteLine(string.Format("Using video compressor - {0}", s));

                s = capturer.CurrentAudioCodecName;
                Console.WriteLine(string.Format("Using audio compressor - {0}", s));

                s = capturer.CurrentAudioLineName;
                Console.WriteLine(string.Format("Using audio input line - {0}", s));

                int i = 0;
                string spin = "|/-\\";
                while (Win32Interop._kbhit() == 0)
                {
                    Console.Write(string.Format("\rEncoding {0}", spin[i++]));
                    i %= 4;
                    Thread.Sleep(50);
                }

                capturer.Stop();
                Console.Write("\nDone");
                Console.Read();
            }
            catch (Exception)
            {
                Console.WriteLine(capturer.LastError);
            }
        }

        static void usage(CapturerClass capturer)
        {
            Console.WriteLine("Usage : CaptureScreenCSharp.exe <outfilename> [left] [top] [width] [height] [fps] [v-codec] [a-codec] [audioline]\n");
            Console.WriteLine("[left, top, width, height] is the rectangle to be captured");
            Console.WriteLine("[v-codec] is the index of the video codec in the list to use.");
            Console.WriteLine("[a-codec] is the index of the audio codec in the list to use.");
            Console.WriteLine("[audioline] is the index of the audio line in the list to capture from");
            Console.WriteLine("If either codec is unspecified, it defaults to 'Microsoft Video 1' and 'GSM 6.10'");
            Console.WriteLine("If audioline is unspecified, it uses the microphone");
            Console.WriteLine("To capture the currently playing output, select the stereo, mono or wave mix");

            Console.WriteLine("Installed Video Codecs (Note : Not all of them may work)");

            for (int i = 0; i < capturer.VideoCodecsCount; i++)
            {
                string name = capturer.GetVideoCodecName(i);
                Console.WriteLine(string.Format("    {0}. {1}", i, name));
            }

            Console.WriteLine("\nInstalled Audio Codecs (Note : Not all of them may work)");
            for (int i = 0; i < capturer.AudioCodecsCount; i++)
            {
                string name = capturer.GetAudioCodecName(i);
                Console.WriteLine(string.Format("    {0}. {1}", i, name));
            }

            Console.WriteLine("\nAudio input lines");
            for (int i = 0; i < capturer.AudioLinesCount; i++)
            {
                string name = capturer.GetAudioLineName(i);
                Console.WriteLine(string.Format("    {0}. {1}", i, name));
            }
        }

        static void setParams(string[] args, CapturerClass capturer)
        {
            if (args.Length > 1)
            {
                int left = int.Parse(args[1]);
                capturer.CaptureRectLeft = left;
            }

            if (args.Length > 2)
            {
                int top = int.Parse(args[2]);
                capturer.CaptureRectTop = top;
            }

            if (args.Length > 3)
            {
                int width = int.Parse(args[3]);
                capturer.CaptureRectWidth = width;
            }

            if (args.Length > 5)
            {
                int height = int.Parse(args[5]);
                capturer.CaptureRectHeight = height;
            }

            if (args.Length > 6)
            {
                float fps = float.Parse(args[6], CultureInfo.InvariantCulture);
                capturer.FPS = fps;
            }

            if (args.Length > 7)
            {
                int vCodec = int.Parse(args[7]);
                capturer.CurrentVideoCodec = vCodec;
            }

            if (args.Length > 8)
            {
                int aCodec = int.Parse(args[8]);
                capturer.CurrentAudioCodec = aCodec;
            }

            if (args.Length > 9)
            {
                int aLine = int.Parse(args[9]);
                capturer.CurrentAudioLine = aLine;
            }
        }
    }
}