22.05.2012

Silverlight 4 Beta ile WebCam ve Mikrofon Erişimi


Silverlight’ın ilk üç versiyonunda müthiş yenilikler geldi ve kullanım oranı her versiyon ile birlikte katlanarak arttı. Hala eksik olan birşeyler vardı, bunların başında WebCam ve Mikrofon erişimi geliyordu. Silverlight 4 Beta ile birlikte müjdeli haber geldi ve artık silverlight ile WebCam ve Mikrofon erişimi mümkün! Hemde kullanımı son derece basit. Uygulamaya geçmeden önce Silverlight 4 Beta için gerekli olan araçları indirip kuralım.
- Visual Studio 2010 Beta 2 yada Visual Web Developer Express 2010 Beta 2
Silverlight 4 Beta Tools for Visual Studio 2010
Windows Runtime yada Mac Runtime
Microsoft Expression Blend for .NET 4 Preview
Araçları kurduktan sonra örneğimiz için Visual Studio 2010 ile yeni bir Silverlight projesi başlatalım. Formumuza Webcam’den gelen görüntüyü göstermek için Rectangle nesnesi, Ses ve kamera aygıtlarını listelemek için iki adet combobox nesnesi, camerayı başlatmak-durdurmak ve cameradaki görüntünün resmini almak için bir adet button ve image nesnesi ekleyelim. XAML kodumuz aşağıdaki gibi oldu.
[XAML]
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="WebCamMicrofon.MainPage" Height="340"Width="550">

<Grid x:Name="LayoutRoot" Background="White">
    <
Rectangle Fill="White" Width="400" Height="300" Stroke="Black" Margin="10,20,130,20" x:Name="player"/>    <ComboBox HorizontalAlignment="Right" VerticalAlignment="Top" Width="120" Margin="0,20,8,0"x:Name="cmbAudioSources"/>
    
<ComboBox HorizontalAlignment="Right" Margin="0,54,8,0" VerticalAlignment="Top" Width="120"x:Name="cmbVideoSources"/>
    <
Button Content="Fotoğraf Çek" Width="104" Margin="422,0,24,175" x:Name="btnTake" Height="22" VerticalAlignment="Bottom" />    <Button Content="Durdur" HorizontalAlignment="Right" VerticalAlignment="Top" Width="104" x:Name="btnStop"Margin="0,115,24,0"/>
    <
Button Content="Oynat" HorizontalAlignment="Right" VerticalAlignment="Top" Width="104" x:Name="btnStart"Margin="0,89,24,0"/>
    <
Image Height="90" HorizontalAlignment="Left" Margin="422,193,0,0" Stretch="Fill" x:Name="image" VerticalAlignment="Top"Width="120" /></Grid></UserControl>
CaptureSource nesnesi, sistemdeki görüntü ve sesin istemcinin browserında yayınlanmasını sağlar. (Hatta yayın sırasında bir karenin yakalanmasını sağlıyor J).
CaptureSource nesnesinin Start metodunu kullanarak görüntünün capture edilmesini sağlıyoruz. Stop medodu ise capture işleminin durdurulmasını sağlıyor. State isimli enum ile CaptureSource nesnesinin capture durumunu kontrol edebiliriz. AudioCaptureDevice özelliği sistemde yer alan ilişkili bir ses aygıtını, VideoCaptureDevice özelliği de sistemde yer alan ilişkili bir görüntü aygıtını temsil eder.
CaptureDeviceConfiguration nesnesi, sistemde yer alan ses ve görüntü aygıtlarına erişmemizi sağlar. Ayrıca kullanıcının bu aygıtlara erişime izin verip vermediğini kontrol eden üyeleri vardır.
[C#]
public partial class MainPage : UserControl{
    public CaptureSource CaptureSource { getset; }

    public
 MainPage()
    {
        InitializeComponent();
        // Kontrolllerin eventlerini oluşturalım
        
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
        this.btnStart.Click += new RoutedEventHandler(btnStart_Click);
        this.btnStop.Click += new RoutedEventHandler(btnStop_Click);
        this.btnTake.Click += new RoutedEventHandler(btnTake_Click);
    }

    void
 MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        // İlk yükleme de sistem de yer alan aygıtları ilgili kontrollere yüklüyoruz.
        
AygitlariYukle();
    }

    private
 void AygitlariYukle()
    {
        // CaptureSource Nesnesinin örneğini alalım.
        
CaptureSource = new CaptureSource();
        // Ses aygıtlarını combobox'a yükleyelim. GetAvailableAudioCaptureDevices() Metodu sisteme yer alan ses aygıtlarını getiriyor.
        
cmbAudioSources.ItemsSource = CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices();
        cmbAudioSources.DisplayMemberPath = "FriendlyName";
        // Kamera aygıtlarını combobox'a yükleyelim. GetAvailableVideoCaptureDevices() Metodu sisteme yer alan kamera aygıtlarını getiriyor.
        
cmbVideoSources.ItemsSource = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices();
        cmbVideoSources.DisplayMemberPath = "FriendlyName";
    }

    void
 btnStart_Click(object sender, RoutedEventArgs e)
    {
        // CaptureSource nesnesi başlatılmadıysa...         if (CaptureSource.State != CaptureState.Started)
        {
            // Seçtiğimiz ses aygıtını CaptureSource nesnesinin AudioCaptureDevice özelliğine bağlayalım.
            
CaptureSource.AudioCaptureDevice = (AudioCaptureDevice)cmbAudioSources.SelectedItem;
            // Seçtiğimiz kamera aygıtını CaptureSource nesnesinin VideoCaptureDevice özelliğine bağlayalım.
            
CaptureSource.VideoCaptureDevice = (VideoCaptureDevice)cmbVideoSources.SelectedItem;

            // VideoBrush nesnesi oluşutralım ve SetSource metoduna CaptureSource'u parametre olarak geçelim.
            VideoBrush vb = new VideoBrush();
            vb.SetSource(CaptureSource);
            // Player isimli kontrol de kameradan gelen görüntüyü gösterelim...
            
player.Fill = vb;

            // İstemci aygıtlara erişimi izni verdiyse capture işlemini başlatalım.
            if (CaptureDeviceConfiguration.AllowedDeviceAccess || CaptureDeviceConfiguration.RequestDeviceAccess())
            {
                CaptureSource.Start();
            }
        }
    }

    void
 btnStop_Click(object sender, RoutedEventArgs e)
    {
        // Kamera görüntüsünü capture ediliyorsa.        if (CaptureSource.State != CaptureState.Stopped)
        {
            // Capture işlemini durduralım.
            
CaptureSource.Stop();
        }
    }

    void
 btnTake_Click(object sender, RoutedEventArgs e)
    {
        // Kamera görüntüsü capture ediliyorsa.        if (CaptureSource.State== CaptureState.Started)
        {
            CaptureSource.AsyncCaptureImage((rsm) =>
            {
                image.Source = rsm; // Yakalanan kamera görüntüsünü Image nesnesine bağlayalım
            
});
        }
    }
}
Uygulamamızı çalıştırdığımızda aşağıdaki gibi bir uyarı çıkacaktır. (Kamera ve Ses aygıtınıza erişime izin vermemizi istiyor) Evet diyerek devem edelim.
Sistemimizde yer alan ses ve kamera aygıtını seçerek kameradan görüntü almaya başlayalım.
Oynat dediğimizde:)
Birde resim yakalayalım :)
Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;)

Hiç yorum yok:

Yorum Gönder