ByteScout Screen Capturing SDK - C# - Video Audio Settings - ByteScout
Announcement
Our ByteScout SDK products are sunsetting as we focus on expanding new solutions.
Learn More Open modal
Close modal
Announcement Important Update
ByteScout SDK Sunsetting Notice
Our ByteScout SDK products are sunsetting as we focus on our new & improved solutions. Thank you for being part of our journey, and we look forward to supporting you in this next chapter!

ByteScout Screen Capturing SDK – C# – Video Audio Settings

  • Home
  • /
  • Articles
  • /
  • ByteScout Screen Capturing SDK – C# – Video Audio Settings

ByteScout Screen Capturing SDK – C# – Video Audio Settings

Form1.cs

using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using BytescoutScreenCapturingLib;
using System.Drawing;

// NOTE: if you are getting error like "invalid image" related to loading the SDK's dll then 
// try to do the following:
// 1) remove the reference to the SDK by View - Solution Explorer
// then click on References, select Bytescout... reference name and right-click it and select Remove
// 2) To re-add click on the menu: Project - Add Reference
// 3) In "Add Reference" dialog switch to "COM" tab and find Bytescout...
// 4) Select it and click "Add" 
// 5) Recompile the application 
// Note: if you need to run on both x64 and x86 then please make sure you have set "Embed Interop Types" to True for this reference


namespace VideoAudioSettings
{
	public partial class Form1 : Form
	{
		private Capturer capturer = null;

		private bool _recording = false;
		private bool _paused = false;

		public Form1()
		{
			InitializeComponent();

			// Create Capturer instance
			capturer = new Capturer();
			capturer.RegistrationName = "demo"; // put your registration name here
			capturer.RegistrationKey = "demo";  // put your registration key here
			

			// Get list of available audio devices
			for (int i = 0; i < capturer.AudioDeviceCount; i++)
			{
				string line = capturer.GetAudioDeviceName(i);
				cmbAudioDevices.Items.Add(line);
			}

			// Select current audio device
			cmbAudioDevices.SelectedIndex = capturer.CurrentAudioDevice;

			// Get list of available AVI audio codecs
			for (int i = 0; i < capturer.AudioCodecsCount; i++)
			{
				string codec = capturer.GetAudioCodecName(i);
				cmbAviAudioCodecs.Items.Add(codec);
			}

			// Select current AVI audio codec
			cmbAviAudioCodecs.SelectedIndex = capturer.CurrentAudioCodec;


			// Get list of available web camera devices
			for (int i = 0; i < capturer.WebCamCount; i++)
			{
				string camera = capturer.GetWebCamName(i);
				cmbWebCameras.Items.Add(camera);
			}

			// Select current web camera
			if (cmbWebCameras.Items.Count != 0)
			{
				cmbWebCameras.SelectedIndex = capturer.CurrentWebCam;
			}
			else
			{
				cmbWebCameras.Items.Add("No devices");
				cmbWebCameras.SelectedIndex = 0;
				cmbWebCameras.Enabled = false;
				cbShowWebCamOverlay.Enabled = false;
			}

			// Get list of available AVI video codecs
			for (int i = 0; i < capturer.VideoCodecsCount; i++)
			{
				string codec = capturer.GetVideoCodecName(i);
				cmbAviVideoCodecs.Items.Add(codec);
			}

			// Select current AVI video codec
			cmbAviVideoCodecs.SelectedIndex = capturer.CurrentVideoCodec;

			// Get list of available WMV audio codecs
			for (int i = 0; i < capturer.WMVAudioCodecsCount; i++)
			{
				string codec = capturer.GetWMVAudioCodecName(i);
				cmbWmvAudioCodecs.Items.Add(codec);
			}

			// Select current WMV audio codec
			cmbWmvAudioCodecs.SelectedIndex = capturer.CurrentWMVAudioCodec;

			// Get list of available WMV video codecs
			for (int i = 0; i < capturer.WMVVideoCodecsCount; i++)
			{
				string codec = capturer.GetWMVVideoCodecName(i);
				cmbWmvVideoCodecs.Items.Add(codec);
			}

			// Select current WMV video codec
			cmbWmvVideoCodecs.SelectedIndex = capturer.CurrentWMVVideoCodec;


			// Fill list of FPS values
			cmbFPS.Items.AddRange(new object&#91;&#93; { 5f, 7.5f, 10f, 12f, 14.985f, 15f, 19.98f, 20f, 23.976f, 24f, 25f, 29.97f, 30f, 50f, 59.94f, 60 });
			// Select current FPS
			cmbFPS.SelectedItem = 14.985f;

			cbCaptureLayeredWindows.Checked = capturer.CaptureTransparentControls;

			nudMouseHotSpot.Value = capturer.MouseSpotRadius;
		}

		// Rectangular region recording mode is selected
		private void cbEnableAudio_CheckedChanged(object sender, EventArgs e)
		{
			cmbAudioDevices.Enabled = cbEnableAudio.Checked;
			cmbAudioLines.Enabled = cbEnableAudio.Checked;
		}

		private void cmbAudioDevices_SelectedIndexChanged(object sender, EventArgs e)
		{
			capturer.CurrentAudioDeviceName = cmbAudioDevices.SelectedItem.ToString();

			cmbAudioLines.Items.Clear();

			// Get list of available audio lines of current audio device
			for (int i = 0; i < capturer.CurrentAudioDeviceLineCount; i++)
			{
				string line = capturer.GetCurrentAudioDeviceLineName(i);
				cmbAudioLines.Items.Add(line);
			}

			// Select current audio line
            if (cmbAudioLines.Items.Count > 0)
            {
                cmbAudioLines.SelectedIndex = capturer.CurrentAudioDeviceLine;
            }
		}

		private void cmbWmvAudioCodecs_SelectedIndexChanged(object sender, EventArgs e)
		{
			capturer.CurrentWMVAudioCodecName = cmbWmvAudioCodecs.SelectedItem.ToString();

			cmbWmvAudioFormats.Items.Clear();

			// Get list of available WMV audio formats
			for (int i = 0; i < capturer.WMVAudioFormatCount; i++)
			{
				string codec = capturer.GetWMVAudioFormatDescription(i);
				cmbWmvAudioFormats.Items.Add(codec);
			}

			// Select current WMV audio format
			cmbWmvAudioFormats.SelectedIndex = capturer.CurrentWMVAudioFormat;
		}

		private void rbRectRegion_CheckedChanged(object sender, System.EventArgs e)
		{
			tbX.Enabled = rbRectRegion.Checked;
			tbY.Enabled = rbRectRegion.Checked;
			tbWidth.Enabled = rbRectRegion.Checked || rbRegionAroundMouse.Checked;
			tbHeight.Enabled = rbRectRegion.Checked || rbRegionAroundMouse.Checked;
		}

		// Region around the mouse recording mode is selected
		private void rbRegionAroundMouse_CheckedChanged(object sender, System.EventArgs e)
		{
			tbX.Enabled = rbRectRegion.Checked;
			tbY.Enabled = rbRectRegion.Checked;
			tbWidth.Enabled = rbRectRegion.Checked || rbRegionAroundMouse.Checked;
			tbHeight.Enabled = rbRectRegion.Checked || rbRegionAroundMouse.Checked;
		}

		// Full screen recording mode is selected
		private void rbFullscreen_CheckedChanged(object sender, System.EventArgs e)
		{
			tbX.Enabled = rbRectRegion.Checked;
			tbY.Enabled = rbRectRegion.Checked;
			tbWidth.Enabled = rbRectRegion.Checked || rbRegionAroundMouse.Checked;
			tbHeight.Enabled = rbRectRegion.Checked || rbRegionAroundMouse.Checked;
		}

		// Show video code internal properties dialog
		private void btnVideoCodecProps_Click(object sender, System.EventArgs e)
		{
			capturer.CurrentVideoCodec = cmbAviVideoCodecs.SelectedIndex;
			capturer.ShowVideoCodecSettingsDialog(Handle.ToInt32());
		}

		// Show log
		private void linkViewLog_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
		{
			string logFile = Path.GetTempPath() + "Capturing Log.txt";

			if (File.Exists(logFile))
			{
				Process prc = new Process();
				prc.StartInfo.FileName = logFile;
				prc.StartInfo.UseShellExecute = true;

				try
				{
					prc.Start();
				}
				catch (Exception ex)
				{
					MessageBox.Show(ex.Message);
				}
			}
		}    
		
		private void btnStartRecording_Click(object sender, System.EventArgs e)
		{
			// Set up the capturer

			if (cbLog.Checked)
			{
				capturer.SetLogFile(Path.GetTempPath() + "Capturing Log.txt");
			}

			bool captureToAvi = (tabControl1.SelectedIndex == 1);

			capturer.AudioEnabled = cbEnableAudio.Checked;
			capturer.CurrentAudioDeviceName = cmbAudioDevices.SelectedItem.ToString();
            if (cmbAudioLines.Items.Count>0)
            {
                capturer.CurrentAudioDeviceLineName = cmbAudioLines.SelectedItem.ToString();
            }
				
			if (captureToAvi)
			{
				capturer.CurrentAudioCodecName = cmbAviAudioCodecs.SelectedItem.ToString();
				capturer.CurrentVideoCodecName = cmbAviVideoCodecs.SelectedItem.ToString();
			}
			else // capture to WMV
			{
				capturer.CurrentWMVAudioCodecName = cmbWmvAudioCodecs.SelectedItem.ToString();
				capturer.CurrentWMVAudioFormat = cmbWmvAudioFormats.SelectedIndex;
				capturer.CurrentWMVVideoCodecName = cmbWmvVideoCodecs.SelectedItem.ToString();
			}

			capturer.MouseAnimationDuration = 400;
			capturer.FPS = float.Parse(cmbFPS.Text);
			capturer.CaptureTransparentControls = cbCaptureLayeredWindows.Checked;
			capturer.MouseSpotRadius = (int) nudMouseHotSpot.Value;

			capturer.OutputWidth = int.Parse(tbWidth.Text);
			capturer.OutputHeight = int.Parse(tbHeight.Text);

			// Set capturing mode

			if (rbRectRegion.Checked)
			{
				capturer.CapturingType = CaptureAreaType.catRegion;
			}
			else if (rbRegionAroundMouse.Checked)
			{
				capturer.CapturingType = CaptureAreaType.catMouse;
			}
			else
			{
				capturer.CapturingType = CaptureAreaType.catScreen;
			}

			if (cbShowWebCamOverlay.Checked)
			{
				// Set web camera device to add overlaying video to the source
				capturer.AddWebCamVideo = true;

				// Set device name or you can set device by index using .CurrentCaptureDevice property
				capturer.CurrentWebCam = cmbWebCameras.SelectedIndex;

				// Set rectangle to show overlaying video from webcam into the rectangle 160x120 (starting with left point at 10,10)
				capturer.SetWebCamVideoRectangle(
					int.Parse(tbWebCameraX.Text), 
					int.Parse(tbWebCameraY.Text), 
					int.Parse(tbWebCameraWidth.Text), 
					int.Parse(tbWebCameraHeight.Text));
			}


            // set border around captured area if we are not capturing entire screen
            if (
                capturer.CapturingType != CaptureAreaType.catScreen &&
                capturer.CapturingType != CaptureAreaType.catWebcamFullScreen
                )
            {
                // set border style
                capturer.CaptureAreaBorderType = CaptureAreaBorderType.cabtDashed;
                capturer.CaptureAreaBorderColor = (uint)ColorTranslator.ToOle(Color.Red);
            }

			// Save to temp file

			String filename = Path.GetTempFileName();
			filename = Path.ChangeExtension(filename, captureToAvi ? "avi" : "wmv");
			capturer.OutputFileName = filename;
			
			try
			{
				// Start capturing
				try
				{
					Cursor = Cursors.WaitCursor;
					capturer.Run();
				}
				finally
				{
					Cursor = Cursors.Default;
				}

				_recording = true;
				btnStartRecording.Enabled = false;
				btnPauseRecording.Enabled = true;
				btnStopRecording.Enabled = true;

				// Wait for "Stop Recording" button pressed
				while (_recording)
				{
					Thread.Sleep(10);
					Application.DoEvents();
				}

				// Stop capturing
				try
				{
					Cursor = Cursors.WaitCursor;
					capturer.Stop();
				}
				finally
				{
					Cursor = Cursors.Default;
				}

				// Ask for output file name
				SaveFileDialog dlg = new SaveFileDialog();

				dlg.Title = @"Save captured video as";
				dlg.FileName = @"Screencast";

				if (captureToAvi)
				{
					dlg.DefaultExt = @"*.avi";
					dlg.Filter = @"AVI files (*.avi)|*.avi|All files (*.*)|*.*";
				}
				else
				{
					dlg.DefaultExt = @"*.wmv";
					dlg.Filter = @"WMV files (*.wmv)|*.wmv|All files (*.*)|*.*";
				}
				
				if (dlg.ShowDialog() == DialogResult.OK)
				{
					// Save to specified file name
					File.Copy(capturer.OutputFileName, dlg.FileName, true);
				}

				// clean up
				try
				{
					File.Delete(capturer.OutputFileName);
				}
				catch
				{
				}

				btnStartRecording.Enabled = true;
				btnPauseRecording.Enabled = false;
				btnStopRecording.Enabled = false;

                // open saved video in default video viewer
				try
				{
					Process.Start(dlg.FileName);
				}
				catch
				{
				}
			}
			catch (COMException ex)
			{
				MessageBox.Show(ex.Message);
			}
		}

		private void btnPauseRecording_Click(object sender, EventArgs e)
		{
			bool captureToAvi = (tabControl1.SelectedIndex == 1);

			if (captureToAvi)
			{
				MessageBox.Show("Pausing is only available for WMV format yet.");
				return;
			}

			if (!_paused)
			{
				capturer.Pause();
				_paused = true;
				btnPauseRecording.Text = "Resume recodring";
			}
			else
			{
				// Resume capturing
				capturer.Run(); 
				_paused = false;
				btnPauseRecording.Text = "Pause recording";
			}
		}

		private void btnStopRecording_Click(object sender, System.EventArgs e)
		{
			// Toggle recording flag
			if (_recording)
			{
				_recording = false;
			}
		}
	}
}

Program.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace VideoAudioSettings
{
	static class Program
	{
		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new Form1());
		}
	}
}

Tutorials:

prev
next