1 / 48

WPF で簡 単ビデオ再生 2008 年 5 月 27 日 ( 火 )

第 28 回 codeseek 勉強会. WPF で簡 単ビデオ再生 2008 年 5 月 27 日 ( 火 ). 宇宙仮面 / C# MVP 2007.10 – 2008.10. 第 28 回 codeseek 勉強会. AGENDA. Agenda. WPF で簡単ビデオ再生. 自己紹介 イントロダクション MediaElement MediaPlayer 独立モードとクロックモード ビデオキャプチャ Q&A. GOAL. 今日帰るときには・・・. WPF のビデオの概要 MediaElement の使い方、特徴を理解

bin
Download Presentation

WPF で簡 単ビデオ再生 2008 年 5 月 27 日 ( 火 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第28回codeseek勉強会 WPF で簡単ビデオ再生2008年5月27日(火) 宇宙仮面 / C# MVP 2007.10 – 2008.10

  2. 第28回codeseek勉強会 AGENDA

  3. Agenda WPFで簡単ビデオ再生 • 自己紹介 • イントロダクション • MediaElement • MediaPlayer • 独立モードとクロックモード • ビデオキャプチャ • Q&A

  4. GOAL 今日帰るときには・・・ • WPF のビデオの概要 • MediaElement の使い方、特徴を理解 • MediaPlayer の使い方、特徴を理解 • 簡単なビデオプレーヤーが作れる

  5. 第28回codeseek勉強会 自己紹介

  6. 自己紹介 なんで、そんなことしているの? • 2000 ごろは、Java/Unix 系でした • Microsoft は嫌いだったので、2000-2002 ぐらいまで、Java/Unix 系でWeb Server を立てて、HPを作っていた。 • 日曜管理者なので、カーネルのメインテナンスに疲れ果てた。 • 少し金を払ってもいいから、楽にサーバーを運用したかったので、Windows 系に乗り換えた。 • Windows 系の開発をしたことがなかったので • Visual Studio 2002 C# Beta が出たので、触ってみた。 • すげー!! • コミュニティ • いろいろな素晴らしい人と出会える。 • 面白い!理屈はいらないでしょ。

  7. 自己紹介 MVPを受賞したきっかけは? • 2002年に Visual Studio 2002 Beta が出た • Beta はタダだったので、使ってみた。 • .NET/C# のすごさに触発された。 • わからないことがいろいろあるが、C#/.NET 関連の日本語 HP がほとんどなかった。 • せっかく調べたのに、忘れてしまうともったいなので、少しづつまとめて、宇宙仮面の C# プログラミングというページを作成していた。 • すこしづつ C# ユーザーが増え、掲示板にも書きこまれるようになった。 • .NET/C# Group を開始 • どなたかが、MVPに推薦してくれたらしい。 • 最初、マルチ商法みたいで怖かったから、テキトーにあしらっていた。 • Microsoft KK から直接説明があったので、お受けすることに。 • 2003/10 MVP for Visual Developer C# 受賞

  8. 第28回codeseek勉強会 イントロダクション

  9. WPF でビデオ・音声メディアを再生 MediaElement と MediaPlayer • WPF でビデオ・音声メディアを再生するには、MediaElement、またはMediaPlayerを使います。それぞれ特徴があるので、しっかり押さえておきたい。 • MediaElement は、WPFに統合されているので、アルファブレンディングや3D の表面にレンダリングも可能 • MediaPlayer には直接的なビジュアル表現がないので、レイアウト上は直接使えません。しかし、Windows Media Player ランタイムを起動する必要がないため、高速に起動できます。また、ビジュアル表現がないので、音声の再生にも適しています。

  10. 第28回codeseek勉強会 MediaElement

  11. 簡単なビデオ再生1 MediaElementにより、単純にビデオを再生 <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="WpfApplication3.Window1" x:Name="Window" Title="Window1" Width="320" Height="240" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid> <MediaElement Source="Test.wmv" LoadedBehavior="Play"/> </Grid> </Window>

  12. demo DEMO1MediaElementにより、単純にビデオを再生

  13. 簡単なビデオ再生2 Expression Blend によるWPF プロジェクトの自動生成 Expression Blend を使用してメディアを再生する WPF プロジェクトを簡単に作ることができます。 1. WMVなどのメディアをプロジェクトに追加する。 2. WMVファイルをダブルクリックするか、フォーム上に Drag & Drop する。

  14. 簡単なビデオ再生2 Expression Blend によるWPF プロジェクトの自動生成 <Window ・・・> <Window.Resources> <Storyboard x:Key="Test_wmv"> <MediaTimeline Source="Test.wmv" BeginTime="00:00:00" Storyboard.TargetName="Test_wmv" d:DesignTimeNaturalDuration="233.129"/> </Storyboard> </Window.Resources> <Window.Triggers> <EventTrigger RoutedEvent="FrameworkElement.Loaded"> <BeginStoryboard Storyboard="{StaticResource Test_wmv}"/> </EventTrigger> </Window.Triggers> <Grid x:Name="LayoutRoot"> <MediaElement Margin="62,46,255,78" x:Name="Test_wmv" Stretch="Fill"/> </Grid> </Window>

  15. demo DEMO2Expression Blend による単純にビデオを再生

  16. 単純なビデオ再生3 Silverlight2 によるWPF プロジェクトの自動生成 ストリーボードなしのシンプルな XAML が生成されます。 Silverlight2 では、まだ MediaTimeline がサポートされていません。 <UserControl xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SilverlightApplication6.Page" Width="320" Height="240"> <Grid x:Name="LayoutRoot" Background="White" > <MediaElement x:Name="Test_wmv" Source="Test.wmv" Stretch="Fill"/> </Grid> </UserControl>

  17. demo DEMO3Silverlight2 によるビデオ再生

  18. 簡単なビデオ再生4 WPF コントロールの内部にビデオを埋め込む • MediaElement コントロールは System.Windows.UIElement クラスから継承されているので、他の UIElement コントロールを配置できるところであればどこでも配置できます。 • <Button Click="Button_Click"> • <MediaElement • x:Name="Test_wmv“ • LoadedBehavior="Manual” • Source="Test.wmv" • Stretch="Fill“ /> • </Button> • ----------- • // C# 再生用コード • this.Test_wmv.Play();

  19. demo DEMO4WPF コントロールの内部にビデオを埋め込む

  20. 簡単なビデオ再生5 プログレスバーの表示 • MediaElement の MediaOpened でプログレスバーの最大値を設定 • Storyboard の CurrentTimeInvalidated でプログレスバーの値を設定する • <MediaElement Name="myMedia" MediaOpened="myMedia_MediaOpened"/> • … • <Storyboard Storyboard.TargetName="myMedia" CurrentTimeInvalidated="Storyboard_CurrentTimeInvalidated"> • <MediaTimeline Source="Test.wmv" x:Name="mTimeline" • BeginTime="00:00:00" Duration="00:10:05" /> • </Storyboard>

  21. 簡単なサンプル5 プログレスバーの表示 • C# 実装部分 • private void Storyboard_CurrentTimeInvalidated(…) { • this.progressBar1.Value = myMedia.Position.TotalMilliseconds; • } • private void myMedia_MediaOpened(...){ • this.progressBar1.Maximum = myMedia.NaturalDuration.TimeSpan.TotalMilliseconds; • }

  22. demo DEMO5プログレスバーの表示

  23. 簡単なビデオ再生6 再生、停止、一時停止、再生位置の変更、ボリュームの変更、再生スピードの調整 注意: メディアを対話的に停止、一時停止、および再生できるようにするには、 MediaElement の LoadedBehavior プロパティを Manual に設定する必要があります。 再生: myMediaElement.Play(); 停止: myMediaElement.Stop(); 一時停止: myMediaElement.Pause(); 再生位置の変更: TimeSpan ts = new TimeSpan(0, 0, 0, 0, SliderValue); myMediaElement.Position = ts; ボリュームの変更: myMediaElement.Volume = (double)volumeSlider.Value; 再生スピードの調整: myMediaElement.SpeedRatio = (double)speedRatioSlider.Value;

  24. demo DEMO6再生、停止、一時停止、再生位置の変更、ボリュームの変更、再生スピードの調整

  25. MediaElement 使用時の注意 再生時の遅延対策 MediaElement を使用した場合、Windows Media Player ランタイムを起動する必要があるため、メディアを最初に再生するときに、遅延が生じる場合があります。 このため、メディア ファイルとユーザー イベントやアニメーションと正確に同期を取って再生することができません。 対策 1. メディア ファイルを事前に読み込み、使用準備が整うまで一時停止状態にしておく。 2. <Storyboard SlipBehavior="Slip"> を指定します。すると、メディアの再生が開始するまで、アニメーションが停止してくれます。

  26. 簡単なビデオ再生6 ビデオを 3D の表面にマップする ModelVisual3D の中で、VisualBrush の MediaElement ソースにメディアファイルを指定します。 <GeometryModel3D.Material> <DiffuseMaterial> <DiffuseMaterial.Brush> <VisualBrush> <VisualBrush.Visual> <MediaElement Source="Test.wmv" /> </VisualBrush.Visual> </VisualBrush> </DiffuseMaterial.Brush> </DiffuseMaterial> </GeometryModel3D.Material>

  27. demo DEMO7ビデオを 3D の表面にマップする

  28. 第28回codeseek勉強会 MediaPlayer

  29. MediaPlayer によるメディアの再生 MediaPlayer の用途 メディアを再生するもう一つの方法として、MediaPlayer があります。 MediaElement は、基本的に MediaPlayer クラスのラッパーなので、MediaElement で実現できることは MediaPlayer で実現できます。 MediaPlayer は - 音楽を再生する - より複雑な処理 に使用します。

  30. MediaPlayer によるメディアの再生 主なプロパティ MediaPlayerのプロパティや、イベントを設定することにより、たとえば次のような操作が可能です。 メディア ファイルの位置を取得または設定 Position プロパティに TimeSpan オブジェクトを設定します。 例 バッファリングの進行状況 BufferingProgress プロパティ 再生の進行状況 DownloadProgress プロパティ オーディオ コントロール Balance プロパティ、 Volume プロパティを設定 メディアの開始を知る MediaOpened イベント メディアの終了を知る MediaEnded イベント

  31. 音楽を再生する ビデオを 3D の表面にマップする WAV オーディオだけの再生であれば、System.Media.SoundPlayer クラスが利用できます。 いろいろな種類の音楽を再生するには、MediaPlayer クラスを使用するのが良いでしょう。 MediaPlayer mp = new MediaPlayer(); Try { mp.Open(new Uri(@"..\..\Test.wma", UriKind.Relative)); mp.Play(); } catch (Exception ex) { MessageBox.Show(ex.Message); }

  32. ビデオを再生する MediaPlayer, DrawingBrush を使って、ビデオをコントロールに描画する <Rectangle Stroke="Black" MouseDown="OnClick1" …> <Rectangle.RenderTransform> <TransformGroup> … </TransformGroup> </Rectangle.RenderTransform> <Rectangle.Fill> <DrawingBrush> <DrawingBrush.Drawing> <VideoDrawing x:Name="MyVideoDrawing“… /> </DrawingBrush.Drawing> </DrawingBrush> </Rectangle.Fill> </Rectangle>

  33. ビデオを再生する MediaPlayer, DrawingBrush を使って、ビデオをコントロールに描画する C# 実装部分 void OnClick1(object sender, RoutedEventArgs e) { MediaPlayer MyPlayer = new MediaPlayer(); MyPlayer.Open(new Uri(@“..\..\Test.wmv”, UriKind.Relative)); MyVideoDrawing.Player = MyPlayer; MyPlayer.Play(); }

  34. demo DEMO8MediaPlayer, DrawingBrush を使って、ビデオをコントロールに描画する

  35. ウェットフロア 2つのビジュアルに同時プレイ

  36. ウェットフロア C# 実装部分 void OnLoaded(object sender, RoutedEventArgs e) { MediaPlayer MyPlayer = new MediaPlayer(); MyPlayer.Open(new Uri(@"..\..\Test.wmv", UriKind.Relative)); MyVideoDrawing.Player = MyPlayer; MyVideoDrawing1.Player = MyPlayer; MyPlayer.Play(); }

  37. demo DEMO9MediaPlayerウェットフロア

  38. 第28回codeseek勉強会 独立モードとクロックモード

  39. 独立モードとクロックモードとは 独立モードとクロックモード MediaElement、および MediaPlayer は、独立モードとクロック モードの2つのモードがあります。 通常の再生だけであれば、独立モードで OK です。 独立モード <MediaElement Source="Test.wmv" Width="320" Height="240" LoadedBehavior="Play"/> クロックモード Expression Blend で、メディアを追加した場合、クロックモードで WPF が生成されます。

  40. 独立モード Clock が null の場合 MediaElement はイメージに似ており、直接 Source URI を指定できます。 標準のメディアを再生および制御する場合、Storyboard や MediaTimeline を扱う必要はありません。 通常の再生だけであれば、独立モードで OK です。 Clock が null の場合、メディア オブジェクトは独立モードです。 特徴 - メディアの Uri を直接指定することができます。 - メディアの再生を直接制御できます。 - メディアの Position プロパティと SpeedRatio プロパティを変更できます。 独立モードの例 <MediaElement Source="Test.wmv" Width="320" Height="240" LoadedBehavior="Play"/>

  41. クロックモード Clock が Null ではない場合 MediaElement は、MediaTimeline によって、メディアの再生が実行されます。 特徴 - メディアの Uri は、MediaTimeline を通じて間接的に設定されます。 - メディアの再生をクロックで制御できます。メディア オブジェクトのコントロール メソッドは使用できません。 Expression Blend で、メディアを追加した場合、クロックモードで WPF が生成されます。 ClockController プロパティを使用すれば、対話形式でクロックを開始、 一時停止、再開、シーク、区間の最後までの前進、停止ができます。

  42. クロックモード クロックモード private void Button_Click(object sender, RoutedEventArgs e) { this.Test_wmv.Clock.Controller.Pause();// クロックのPause } private void Button_Click_1(object sender, RoutedEventArgs e) { this.Test_wmv.Clock.Controller.Seek(new TimeSpan(0, 0, 30), TimeSeekOrigin.BeginTime); // クロックをシーク this.Test_wmv.Clock.Controller.Resume(); } private void Window_Loaded(object sender, RoutedEventArgs e) { MediaTimeline mTimeline = new MediaTimeline(new Uri(@"..\..\Test.wmv", UriKind.Relative)); MediaClock mClock = mTimeline.CreateClock(); this.Test_wmv.Clock = mClock; this.Test_wmv.Clock.Controller.Begin(); }

  43. demo DEMO 10クロックモード

  44. 第28回codeseek勉強会 ビデオキャプチャ

  45. ビデオキャプチャ <Rectangle Stroke="Black" MouseLeftButtonDown="Rectangle_MouseDown" RenderTransformOrigin="0.5,0.5" Margin="102,11,14,0" Height="89.305" VerticalAlignment="Top"> <Rectangle.RenderTransform> <TransformGroup> </TransformGroup> </Rectangle.RenderTransform> <Rectangle.Fill> <DrawingBrush> <DrawingBrush.Drawing> <VideoDrawing x:Name="MyVideoDrawing…/> </DrawingBrush.Drawing> </DrawingBrush> </Rectangle.Fill> </Rectangle> <Image Height="30" HorizontalAlignment="Left“ Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="72" />

  46. ビデオキャプチャ C# 実装部分 MediaPlayer MyPlayer = new MediaPlayer(); private void Rectangle_MouseDown(…) { MyPlayer.Open(new Uri(@"..\..\Test.wmv", UriKind.Relative)); MyVideoDrawing.Player = MyPlayer; MyPlayer.Play(); } private void button1_Click(…) { RenderTargetBitmap rtb = new RenderTargetBitmap((int)image1.Width, (int)image1.Height, 1 / 200, 1 / 200, PixelFormats.Pbgra32); DrawingVisual dv = new DrawingVisual(); DrawingContext dc = dv.RenderOpen(); dc.DrawVideo(MyPlayer, new Rect(0, 0, (int)image1.Width, (int)image1.Height)); dc.Close(); rtb.Render(dv); this.image1.Source = BitmapFrame.Create(rtb); using (FileStream stream = new FileStream("capture.png", FileMode.Create)) { PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(rtb)); encoder.Save(stream); } } }

  47. demo DEMO 11ビデオキャプチャ

  48. Resources 宇宙仮面の C# http://uchukamen.com WPF を使ってコントロールと 3D の表面にビデオを追加する http://msdn.microsoft.com/ja-jp/magazine/cc163455.aspx MSDN MediaElement クラス http://msdn.microsoft.com/ja-jp/library/system.windows.controls.mediaelement.aspx

More Related