ASP.NET / Asp.Net ve Silverlight ile Video İşlemleri

Makale

 

Bu makalede basit bir silverlight media player yapımından,  yaptığımız media player ile video dosyalarının oynatılmasından ve anlık olarak video dosyasından resimler yakalamakla ilgili bilgiler paylaşıyor olacağım. 



Solution Explorer


Veritabanının şişmesini engellemek için videoların adlarını tutmak daha mantıklıdır. Örneğin 200 mb lik bir videonun,veritabanında kaplayacağı yer ile videonun isminin veritabanında kaplayacağı yer aynı değildir. Bu nedenle, veritabanındaki video tablosunu aşağıdaki gibi düzenliyorum.



Veritabanındaki Video Tablosu


Veritabanı kısmını hallettikten sonra, yenibir web sitesi oluşturuyorum ve Default.aspx, Upload.aspx, Video.aspx sayfalarını siteye ekliyorum. Önce video upload işlemini yapabilmek için Upload.aspx sayfasını aşağıdaki gibi düzenliyorum.

 

Upload.aspx

 

<body>

    <form id="form1" runat="server">

    <div>

        <asp:FileUpload ID="fileUpVideo" runat="server" />

        <br /><br />

        <asp:Button ID="btnKaydet" runat="server" onclick="btnKaydet_Click" Text="Kaydet" />

        <br /><br />

        <asp:Label ID="lblSonuc" runat="server"></asp:Label>

    </div>

    </form>

</body>

 

Burada fileupload kontrolüyle seçilen video dosyasını Kaydet butonu aracılığıyla hem veritabanına kaydedeceğiz, hem de video dosyasını sunucuda ClientBin klasörü içine kopyalayacağız.

 

Upload.aspx.cs

 

protected void btnKaydet_Click(object sender, EventArgs e)

{

    if(fileUpVideo.HasFile != false &&fileUpVideo.PostedFile != null)

    {

        SqlConnection cn = new SqlConnection("server = .; database = videoupload; IntegratedSecurity = true;");

        SqlCommand cmd = new SqlCommand("insert into Video values (@Ad, @ResimUrl)",cn);

        cmd.Parameters.AddWithValue("@Ad", fileUpVideo.FileName);

        cmd.Parameters.AddWithValue("@ResimUrl", "videoicon.jpg ");

        try

        {

            cn.Open();

            cmd.ExecuteNonQuery();

            lblSonuc.Text = string.Format("{0} adlı video başarıyla yüklenmiştir.", fileUpVideo.FileName);

        }

        catch (Exception ex)

        {

            lblSonuc.Text =ex.Message.ToString();

        }

        fileUpVideo.SaveAs(Server.MapPath("~/ClientBin/" fileUpVideo.FileName));

    }

    else

    {

        lblSonuc.Text = "Lütfen bir video dosyası seçiniz.";

    }

}

 

Kaydet butonuna basıldığında, önce yüklenecek bir dosyanın olup olmadığının kontrolünü yapıyoruz; ardından ise Video tablosuna dosya adını ve videolar listelenirken görüntülenecek resimurl’sini kaydediyoruz ve dosyayı ClientBin klasörüne kopyalıyoruz. Şimdi videoların listeleneceği Default.aspx sayfasını düzenleyelim.

 

Default.aspx

 

<body>

    <form id="form1" runat="server">

    <a href="Upload.aspx">Yeni Video Yükle</a>

    <br /><br />

    <div>

        <asp:DataList ID="dlVideolar" runat="server" RepeatDirection="Horizontal">

            <ItemTemplate>

                <h4><%# Eval("Ad"%></h4>

                <img src='<%# Eval("ResimUrl").ToString() %>' alt='<%# Eval("Ad").ToString() %>' />

                <br />

                <a href='<%# "Video.aspx?id=" Eval("ID").ToString() %>'>Bu Videoyu İzle</a>

            </ItemTemplate>

        </asp:DataList>

    </div>

    </form>

</body>

 

Default.aspx.cs

 

protected void Page_Load(objectsender, EventArgs e)

{

    if(Page.IsPostBack)

    {

        return;

    }

 

    VideolariGetir();

}

 

private void VideolariGetir()

{

    VideoLinqDataContext dc = new VideoLinqDataContext();

    dlVideolar.DataSource = dc.Videos;

    dlVideolar.DataBind();

}

 

Default.aspx sayfası yüklenirken veritabanından videoları alıyorum ve datalist ile listeliyorum. dlVideolar kontrolünün itemtemplate kısmına eklediğim html elemanlarına, videoların özelliklerini bağlıyorum.



Default video listeleme sayfası


Şimdi video oynatacağımız media playerimizi oluşturalım. Video.aspx sayfasında çalışmaya başlamadan önce silverlight ile video işlemleri konusunda küçük bilgilere değineceğim. Silverlight ile canlı veya kayıttan(banttan) video göstermemizi sağlayan kontrol MediaElement kontrolüdür. Bu kontrolün Source özelliğine verilen değeri işleyerek videoyu oynatır. Web sitemize yeni bir silverlight projesi ekliyorum ve MainPage.xaml dosyamı aşağıdaki gibi düzenliyorum. Bu silverlight projesi Video.aspx sayfasında host edilecek.

 

MainPage.xaml

 

<Grid x:Name="LayoutRoot"Background="White" MinWidth="400"MinHeight="300">

    <Grid.RowDefinitions>

       <RowDefinition Height="260"/>

       <RowDefinition Height="40"/>

    </Grid.RowDefinitions>

    <MediaElement x:Name="mePlayer"/>

    <Rectangle Fill="Black"Grid.Row="1"/>

    <StackPanel Grid.Row="1"Orientation="Horizontal" Margin="80,0">

       <Button x:Name="btnPlay"Content="" Width="70"Height="22"/>

       <Button x:Name="btnGrap"Content="Get Picture" Width="70"Height="22"/>

       <TextBlock x:Name="txbPosition"Foreground="Black"/>

    </StackPanel>

</Grid>

 

MainPage.xaml dosyamızın görevi seçilen videoyu oynatmak, durdurmak ve anlık olarak videodan resim yakalamaktır.Kodlamaya geçmeden önce belirtmek isterim ki, bu bölümde silverlight resmi forumundan faydalandım.

 

MainPage.xaml.cs

 

void MainPage_Loaded(object sender, RoutedEventArgs e)

{

    VideoYonetimSoapClient client = new VideoYonetimSoapClient();

    int id = int.Parse(System.Windows.Browser.HtmlPage.Document.QueryString["id"].ToString());

    client.VideoGetirAsync(id);

    client.VideoGetirCompleted = new EventHandler<VideoGetirCompletedEventArgs>(client_VideoGetirCompleted);

}

 

void client_VideoGetirCompleted(object sender, VideoGetirCompletedEventArgs e)

{

    string url = App.Current.Host.Source.ToString().Replace("AspnetVideo.Player.xap", "") e.Result.Ad;

    mePlayer.Source = newUri(url);

    mePlayer.Play();

    btnPlay.Content = "Pause";

}

 

void btnGrap_Click(object sender, RoutedEventArgs e)

{

    mePlayer.Pause();

    txbPosition.Text = mePlayer.Position.ToString();

   

    ResimCek();

}

 

private void ResimCek()

{

    WriteableBitmap writeableBitmap = new WriteableBitmap(mePlayer,null);

    SaveFileDialog saveFileDialog = new SaveFileDialog();

    saveFileDialog.DefaultExt = ".bmp";

    saveFileDialog.Filter = "(*.bmp, *.jpg)|*.bmp;*.jpg";

   

    if(saveFileDialog.ShowDialog() == true)

    {

        //bu kısım linkten alıntıdır.http://forums.silverlight.net/t/114691.aspx/1

        Stream stream = saveFileDialog.OpenFile();

        byte[] buffer = GetBuffer(writeableBitmap);

        stream.Write(buffer, 0, buffer.Length);

        stream.Flush();

        stream.Close();

    }

}

 

Silverlight uygulaması yüklenirken, Video.aspx sayfasındaki QueryString değerine göre, VideoService webservisi aracılığıyla veri tabanından videoyu alıp mePlayer MediaElement kontrolünün Source özelliğine uri olarak veriyorum. Ayrıca Grap butonuna basıldığında video donduruluyor ve o andaki MediaElement kontrolünde beliren resim, bmp formatında kullanıcının bilgisayarına kaydediliyor. Bu noktada gereken encoder, GetBuffer metodu’dur. VideoService webservisindeki metodun içeriği ise aşağıdaki gibidir:

 

[WebMethod]

public Video VideoGetir(intid)

{

    VideoLinqDataContextdc = new VideoLinqDataContext();

    Videovideo = (from v indc.Videos

                   wherev.ID == id

                   selectv).FirstOrDefault();

    returnvideo;

}

 

Şimdi video.aspx sayfamızı düzenleyelim. Bu sayfada sadece video oynatacağımız silverlight media playerimiz olacak. Bu nedenle sayfa tasarımında sadece silverlight uygulamasının host edileceği object nesnesi bulunacak.

 

<body>

    <form id="form1" runat="server">

    <div id="silverlightControlHost">

        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2"width="500px"height="500px">

                <param name="source"value="ClientBin/AspnetVideo.Player.xap"/>

                <param name="onError"value="onSilverlightError"/>

                <param name="background"value="white"/>

                <param name="minRuntimeVersion"value="4.0.50826.0"/>

                <param name="autoUpgrade"value="true"/>

                <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0"style="text-decoration:none">

                       <img src="http://go.microsoft.com/fwlink/?LinkId=161376"alt="Get MicrosoftSilverlight" style="border-style:none"/>

                </a>

           </object><iframe id="_sl_historyFrame"style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>

    </form>

</body>

 

Şu anda, uygulamamız artık kullanıma hazır. Web uygulamamızı çalıştırıdığımızda, default sayfasında kayıtlı videolar listeleniyor, upload sayfasında video kaydedip sunucuya yükleyebiliyorum. Video sayfasında ise seçtiğim videoyu izleyebiliyorum, anlık resim yakalayabiliyorum.


Makalede geliştirilen projedir.

  • Tarih : 21.01.2013 10:09:43


Etiketler: Asp.Net Silverlight , Asp.Net Video İşlemleri ,

Yapılan Yorumlar

Sizde Bir Yorum Yazın...