0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

cscの作法 その287

Posted at

概要

cscの作法、調べてみた。
directshow.dll使ってみた。
カメラを録画してみた。

サンプルコード

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Windows.Forms;
using System.Threading;
using DirectShowLib;
using System.ComponentModel;
using System.Data;

namespace AsfFilter
{
	internal class Capture: IDisposable {
		private IFilterGraph2 m_FilterGraph = null;
		IMediaControl m_mediaCtrl = null;
		private bool m_bRunning = false;
		DsROTEntry m_rot = null;
		public void Dispose() {
			GC.SuppressFinalize(this);
			CloseInterfaces();
		}
		~Capture() {
			Dispose();
		}
		public Capture(int iDeviceNum, string szOutputFileName) {
			DsDevice [] capDevices;
			capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
			if (iDeviceNum + 1 > capDevices.Length)
			{
				throw new Exception("No video capture devices found at that index!");
			}
			try
			{
				SetupGraph(capDevices[iDeviceNum], szOutputFileName);
				m_bRunning = false;
			}
			catch
			{
				Dispose();
				throw;
			}
		}
		public void Start() {
			if (!m_bRunning)
			{
				int hr = m_mediaCtrl.Run();
				Marshal.ThrowExceptionForHR(hr);
				m_bRunning = true;
			}
		}
		public void Pause() {
			if (m_bRunning)
			{
				IMediaControl mediaCtrl = m_FilterGraph as IMediaControl;
				int hr = mediaCtrl.Pause();
				Marshal.ThrowExceptionForHR(hr);
				m_bRunning = false;
			}
		}
		private void SetupGraph(DsDevice dev, string szOutputFileName) {
			int hr;
			IBaseFilter capFilter = null;
			IBaseFilter asfWriter = null;
			ICaptureGraphBuilder2 capGraph = null;
			m_FilterGraph = (IFilterGraph2) new FilterGraph();
			m_rot = new DsROTEntry(m_FilterGraph);
			try
			{
				capGraph = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
				hr = capGraph.SetFiltergraph(m_FilterGraph);
				Marshal.ThrowExceptionForHR(hr);
				hr = m_FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter);
				Marshal.ThrowExceptionForHR(hr);
				asfWriter = ConfigAsf(capGraph, szOutputFileName);
				hr = capGraph.RenderStream(null, null, capFilter, null, asfWriter);
				Marshal.ThrowExceptionForHR(hr);
				m_mediaCtrl = m_FilterGraph as IMediaControl;
			}
			finally
			{
				if (capFilter != null)
				{
					Marshal.ReleaseComObject(capFilter);
					capFilter = null;
				}
				if (asfWriter != null)
				{
					Marshal.ReleaseComObject(asfWriter);
					asfWriter = null;
				}
				if (capGraph != null)
				{
					Marshal.ReleaseComObject(capGraph);
					capGraph = null;
				}
			}
		}
		private IBaseFilter ConfigAsf(ICaptureGraphBuilder2 capGraph, string szOutputFileName) {
			IFileSinkFilter pTmpSink = null;
			IBaseFilter asfWriter = null;
			int hr = capGraph.SetOutputFileName(MediaSubType.Asf, szOutputFileName, out asfWriter, out pTmpSink);
			Marshal.ThrowExceptionForHR(hr);
			try
			{
				IConfigAsfWriter lConfig = asfWriter as IConfigAsfWriter;
				Guid cat = new Guid(0x6E2A6955, 0x81DF, 0x4943, 0xBA, 0x50, 0x68, 0xA9, 0x86, 0xA7, 0x08, 0xF6);
				hr = lConfig.ConfigureFilterUsingProfileGuid(cat);
				Marshal.ThrowExceptionForHR(hr);
			}
			finally
			{
				Marshal.ReleaseComObject(pTmpSink);
			}
			return asfWriter;
		}
		private void CloseInterfaces() {
			int hr;
			try
			{
				if (m_mediaCtrl != null)
				{
					hr = m_mediaCtrl.Stop();
					m_bRunning = false;
				}
			}
			catch
			{
			}
			if (m_rot != null)
			{
				m_rot.Dispose();
				m_rot = null;
			}
			if (m_FilterGraph != null)
			{
				Marshal.ReleaseComObject(m_FilterGraph);
				m_FilterGraph = null;
			}
		}
	}
	public class Form1 : System.Windows.Forms.Form {
		private System.Windows.Forms.Button button1;
		private System.Windows.Forms.TextBox textBox1;
		private System.Windows.Forms.Label label1;
		private System.ComponentModel.Container components = null;
		public Form1() {
			InitializeComponent();
		}
		protected override void Dispose(bool disposing) {
			if (disposing)
			{
				if (cam != null)
				{
					cam.Dispose();
					cam = null;
				}
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose(disposing);
		}
		private void InitializeComponent() {
			this.button1 = new System.Windows.Forms.Button();
			this.textBox1 = new System.Windows.Forms.TextBox();
			this.label1 = new System.Windows.Forms.Label();
			this.SuspendLayout();
			this.button1.Location = new System.Drawing.Point(88, 80);
			this.button1.Name = "button1";
			this.button1.Size = new System.Drawing.Size(75, 48);
			this.button1.TabIndex = 0;
			this.button1.Text = "Start";
			this.button1.Click += new System.EventHandler(this.button1_Click);
			this.textBox1.Location = new System.Drawing.Point(16, 40);
			this.textBox1.Name = "textBox1";
			this.textBox1.Size = new System.Drawing.Size(160, 20);
			this.textBox1.TabIndex = 1;
			this.textBox1.Text = "foo.wmv";
			this.label1.Location = new System.Drawing.Point(16, 24);
			this.label1.Name = "label1";
			this.label1.Size = new System.Drawing.Size(56, 16);
			this.label1.TabIndex = 2;
			this.label1.Text = "Output file";
			this.AcceptButton = this.button1;
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(248, 162);
			this.Controls.Add(this.label1);
			this.Controls.Add(this.textBox1);
			this.Controls.Add(this.button1);
			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
			this.MaximizeBox = false;
			this.Name = "Form1";
			this.Text = "AsfFilter";
			this.ResumeLayout(false);
			this.PerformLayout();
		}
		Capture cam = null;
		private void button1_Click(object sender, System.EventArgs e) {
			const int VIDEODEVICE = 0;
			Cursor.Current = Cursors.WaitCursor;
			if (cam == null)
			{
				cam = new Capture(VIDEODEVICE, textBox1.Text);
				cam.Start();
				button1.Text = "Stop";
				textBox1.ReadOnly = true;
			}
			else
			{
				button1.Text = "Start";
				textBox1.ReadOnly = false;
				cam.Pause();
				cam.Dispose();
				cam = null;
			}
			Cursor.Current = Cursors.Default;
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}






以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?