成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WPF中兩種不同的視頻流的使用

開發 后端
本文將為大家介紹WPF中兩種不同的視頻流的使用,希望對大家今后的開發工作有所幫助。

WPF中的進行視頻的播放有兩種方式:一種是采用MediaElement+VisualBrush的方式;而另一種則是采用MediaPlayer+VideoDrawing的方式。考慮到MediaElement在處理視頻時會將布局的Stretch和StretchDirect縮放視頻窗口的內容以適應包容器,而MediaPlayer相反則不需要管理布局、焦點以及所有其他元素細節。所以后者相比前者有更高的效率。當然現代的處理器下是不會看到這兩者的明顯的區別的。不過筆者試了一下,在.Net Framework 3.5下對同一視頻的兩個窗口,會出現其中一個窗口的視頻幀率不一樣的情況,也就是說一個窗口的視頻播放很平滑的,而另一個則以動畫的形式出現,這可能是在3.5下為了實現同步,不得不使用剪幀技術造成的。不過我試著將同一個項目升級到.net Framework 4.0下,則不會出現此類現象,可見微軟在4.0下做了不小的優化技術。正如微軟在發布4.0所說的一樣,其效率已經大大的改進了,一點兒不假。

當然我個人建議在使用視頻播放設計中,應該使用4.0框架,這樣可以很高效地運行你開發的視頻播放程序。這是閑話,現在言歸正傳,我在這個例子中使用了兩種不同的方式來實現視頻播放的控制,實現一些比較通行的視頻編程框架。

同樣我們還是先來了解一下幾個比較重要的類型:

◆MediaTimeline 類

一個 Timeline 對象,它控制媒體計時的方式,與動畫時間線對象控制動畫的方式相同。這個類型有一個很重要的方法CreateClock();它的簽名如下:

public MediaClock CreateClock();創建一個與 MediaTimeline 關聯的新的 MediaClock。

◆MediaClock 類

通過 MediaTimeline 維護媒體的計時狀態的類。 通過它我們可以同步MediaElement和MediaPlayer對象。以實現視頻播放的控制。

public ClockController Controller { get; }這個屬性是對播放進行控制。

◆VisualBrush 類

使用 Visual 繪制區域。

public Visual Visual { get; set; }設置源對象。

public Transform RelativeTransform { get; set; }獲取或設置要使用相對坐標應用于畫筆的變換。

◆DrawingBrush 類

用 Drawing 繪制區域,其中可以包括形狀、文本、視頻、圖像或其他繪圖。

方式一:MediaElement+VisualBrush

步驟1:布置可視元素:這里為了實現的方便,我們在主窗體中放置了一個兩行的Grid控件,第一行勝于按鍵控件的安裝,第二行用于視頻的播放和倒影窗口,相應的代碼如下:

  1. <Window.Resources> 
  2. <MediaElement x:Key="video" Source="future_nasa.wmv" Stretch="Fill" LoadedBehavior="Manual"/> 
  3. </Window.Resources> 
  4. <Grid x:Name="LayoutRoot" Background="#FFC7DAE5"> 
  5. <Grid.RowDefinitions 
  6. ><RowDefinition Height="50"/> 
  7. <RowDefinition Height="1*"/> 
  8. <RowDefinition Height="1*"/> 
  9. </Grid.RowDefinitions> 
  10. <Border x:Name="orgin" BorderBrush="DarkGray" BorderThickness="1" Grid.Row="1" CornerRadius="2" > 
  11. </Border> 
  12. <Border BorderBrush="Black" BorderThickness="1" Grid.Row="2" CornerRadius="2" Background="Black" > 
  13. <Rectangle x:Name="reflector" VerticalAlignment="Stretch" Stretch="Fill" HorizontalAlignment="Stretch"> 
  14. </Rectangle> 
  15. </Border> 
  16. <Border x:Name="controls" BorderThickness="3" CornerRadius="3" > 
  17. <Border.BorderBrush> 
  18. <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
  19. <GradientStop Color="#FF98BBD2" Offset="0"/> 
  20. <GradientStop Color="White" Offset="1"/> 
  21. <GradientStop Color="#FFBDD3E2" Offset="0.648"/> 
  22. <GradientStop Color="#FFD3E1EB" Offset="0.258"/> 
  23. </LinearGradientBrush> 
  24. </Border.BorderBrush> 
  25. <Rectangle> 
  26. <Rectangle.Fill> 
  27. <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
  28. <GradientStop Color="#CCFFFFFF" Offset="1"/> 
  29. <GradientStop Color="#33FFFFFF"/> 
  30. </LinearGradientBrush> 
  31. </Rectangle.Fill> 
  32. </Rectangle> 
  33. </Border> 
  34. <StackPanel Orientation="Horizontal" > 
  35. <Button x:Name="tme" Content="Test MediaElement" Width="125" Height="30" Margin="50,0,20,0" Click="tme_Click"/> 
  36. <Button x:Name="tmp" Content="Test MediaPlayer" Width="125" Height="30" Margin="0,10" Click="tmp_Click"/> 
  37. <Button x:Name="start" Content="Start" Width="75" Height="30" Margin="20,10,0,10" Click="start_Click" /> 
  38. <Button x:Name="stop" Content="Stop" Width="75" Height="30" Margin="20,10,0,10" Click="stop_Click" /> 
  39. <Button x:Name="resume" Content="Resume" Width="75" Height="30" Margin="20,10,0,10" Click="resume_Click" /> 
  40. <Button x:Name="pause" Content="Pause" Width="75" Height="30" Margin="20,10,0,10" Click="pause_Click" /> 
  41. </StackPanel> 
  42. </Grid>  

步驟2:在代碼文件的最前面聲明了三個對象,以引用XAML聲明的元素:

  1. //保存引用的元素private FrameworkElement reflectorElement;
  2. private FrameworkElement originElement;
  3. private MediaClock clock;  

步驟3:在后置代碼中處理MediaElement對象,正如XAML聲明式的代碼中我們看到的那樣,我們這兒將MediaElement對象聲明成了一個資源,這樣就可以以共享方式使用元素了。這兒先引用MediaElement對象,接著聲明一個MediaClock對象。相應的代碼如下:

  1. MediaElement mediaElement = Resources["video"as MediaElement;  
  2. //得到資源orgin.Child = mediaElement;mediaElement.Clock = 
  3. clock;clock.Controller.Seek(new TimeSpan(0, 0, 0, 2), TimeSeekOrigin.BeginTime);  
  4. //跳過固定的時間線  

步驟4:聲明一個VisualBrush對象,并利用其RelativeTransform屬性將視頻倒置,形成倒影圖像。

 
  1. VisualBrush brush = new VisualBrush();brush.Visual = mediaElement;  
  2. //使用MediaElement對象brush.RelativeTransform = new ScaleTransform { ScaleY = -1, CenterY = 0.5 };  
  3. //通過VisualBrush對象進行布局控制  

步驟5:實現蒙版效果,即設置OpacityMask的透明掩碼。

  1. LinearGradientBrush maskBrush = new LinearGradientBrush { StartPoint = new Point(0, 0), EndPoint = new Point(0, 1) };  
  2. GradientStop stopOne = new GradientStop { Color = Colors.Black, Offset = 0 };  
  3. GradientStop stopTwo = new GradientStop { Color = Colors.Transparent, Offset = 0.875 };  
  4. maskBrush.GradientStops.Add(stopOne);  
  5. maskBrush.GradientStops.Add(stopTwo);//生成掩碼的對象reflector.Fill = brush;reflector.OpacityMask = maskBrush; 

至此,我們就實現了VisualElement+VisualBrush的組合實現了視頻的播放。

方式二:MediaPlayer+DrawingBrush

步驟1:采用方式一的布局格式,相應代碼不變。

步驟2:聲明MediaPlayer對象以及時鐘控制關。

  1. reflector.LayoutTransform = new ScaleTransform { ScaleY = -1, CenterY = 0.5 };  
  2. //設置自己的布局LinearGradientBrush maskBrush = new LinearGradientBrush { StartPoint = new Point(0, 0), EndPoint = new Point(0, 1) };  
  3. GradientStop stopOne = new GradientStop { Color = Colors.Black, Offset = 0.875 };  
  4. GradientStop stopTwo = new GradientStop { Color = Colors.Transparent, Offset = 0 };  
  5. maskBrush.GradientStops.Add(stopOne);maskBrush.GradientStops.Add(stopTwo);reflector.OpacityMask = maskBrush;  
  6. //以下是聯合VideoDrawing和MediaPlayer的設置MediaPlayer player = new MediaPlayer();  
  7. //使用MediaPlayer對象player.Clock = clock; 

步驟3:定義一個VideoDrawing對象,并關聯到MediaPlayer對象。

  1. VideoDrawing drawing = new VideoDrawing();drawing.Rect = new Rect(150, 0, 100, 100);  
  2. drawing.Player = player;  
  3. //將MediaPlayer賦給VideoDrawingDrawingBrush brush = new DrawingBrush(drawing);  
  4. //得到使用的繪圖畫刷 

步驟4:關聯到布局元素.

  1. Rectangle border = new Rectangle();  
  2. border.Stretch = Stretch.Fill;orgin.Child = border;  
  3. border.Fill = brush;orgin.Child = border;  
  4. reflector.Fill = brush;clock.Controller.Stop(); 

步驟5:現在我們可以利用MediaClock對象的Controller對象來實現播放的開始、停止等控制了。

  1. private void start_Click(object sender, RoutedEventArgs e){clock.Controller.Stop();  
  2. clock.Controller.Begin();  
  3. pause.IsEnabled =true ;  
  4. resume.IsEnabled = false ;  
  5. stop.IsEnabled = true ;  
  6. start.IsEnabled = false;}
  7. private void stop_Click(object sender, RoutedEventArgs e){clock.Controller.Stop();  
  8. start.IsEnabled = true;
  9. pause.IsEnabled = false;
  10. resume.IsEnabled = false;
  11. stop.IsEnabled = false;  
  12. }  
  13. private void resume_Click(object sender, RoutedEventArgs e){clock.Controller.Resume();  
  14. start.IsEnabled = false;
  15. pause.IsEnabled = true ;  
  16. resume.IsEnabled = true ;
  17. stop.IsEnabled = true ;  
  18. }  
  19. private void pause_Click(object sender, RoutedEventArgs e){clock.Controller.Pause();  
  20. start.IsEnabled = false ;  
  21. pause.IsEnabled = false;  
  22. resume.IsEnabled = true ;
  23. stop.IsEnabled = false;}  

總結:上面的兩種方式都很好地實現了視頻的播放控制,通過關聯到MediaTimeline時鐘,我們可以控制其中的任何一種方式的實現,至于兩者的效率方面,我覺得用MediaElement的方式使用更為方便,因為只需在XAML代碼中簡單聲明即可使用,而MediaPlayer則需要相應的后置代碼的配合,使用起來不如前者方便,由于其在效率方面略高,所以我們可以在效率和方便性兩個方面權衡使用這兩種方式。

效果如下:

原文標題:WPF中的使用視頻流的兩種方式

鏈接:http://www.cnblogs.com/suyan010203/archive/2010/07/12/1776053.html

【編輯推薦】

  1. Visual Studio 2010截圖曝光 以WPF開發UI
  2. 為WPF項目創建單元測試
  3. 詳解Silverlight和WPF互相擴展
  4. 教你如何理解WPF中的Template類
  5. 詳談WPF開發中的數據虛擬化
責任編輯:彭凡 來源: 博客園
相關推薦

2023-03-29 13:06:36

2010-03-16 15:23:32

java動態載入

2019-01-11 13:57:06

2015-04-30 08:00:05

數據中心多種操作系統

2010-03-15 15:30:35

Python模塊

2009-06-08 20:07:44

Eclipse中使用p

2010-07-15 14:38:55

Perl eval函數

2012-12-13 10:32:34

路由器線路輸出

2024-10-14 08:35:29

2021-05-27 10:57:01

TCP定時器網絡協議

2010-10-11 10:31:51

MySQL分區

2013-05-27 14:31:34

Hadoop 2.0

2020-06-18 08:18:35

密碼加密安全

2011-03-03 17:00:37

pure-ftpdchroot

2010-01-19 14:08:29

路由交換一體機

2010-07-13 15:39:23

SQL Server

2009-06-29 18:11:40

JSP設計模式

2009-09-14 19:25:09

Ruby form

2010-09-02 16:46:18

SQL刪除

2010-08-24 09:00:43

JavaC#
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲女人天堂成人av在线 | 亚洲91精品 | 成年网站在线观看 | 日韩一区二区免费视频 | 殴美黄色录像 | 婷婷五月色综合 | 天堂av在线影院 | 最新国产精品视频 | 亚洲一区二区中文字幕在线观看 | 免费视频二区 | 国产美女一区 | 国产aⅴ | 美女视频久久 | 在线观看视频一区 | 黄久久久| 亚洲精品视频免费 | 久久狠狠 | 99re6在线 | 久久国产精品99久久久久 | 欧美xxxx网站| 一级特黄色毛片 | 美女视频网站久久 | 精品一二区 | 成人综合久久 | 午夜国产羞羞视频免费网站 | 久久成人综合 | 精品无码久久久久国产 | 97av| 性一交一乱一透一a级 | 日韩欧美在线视频观看 | 久久精品一区 | 国产玖玖 | 精品久久一区二区三区 | 国产精品v| 中文字幕亚洲专区 | 中文字幕视频在线 | 黄色网址在线免费播放 | 国产伦精品一区二区三区在线 | 国产偷录叫床高潮录音 | 天天操天天操 | 亚洲高清免费视频 |