質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

16131閲覧

WPFでの動画再生で気になったこと

suzuki123

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2016/10/05 11:32

MediaElementを使用した単純な動画再生プログラムを作成したのですが、
一点気になった箇所がありました。

「再生」ボタン押下して、動画が再生されることは確認できたのですが、
実際の映像が再生されるまで黒背景?が映っていました。(体感で500msくらい)
この現象はMediaElementでは必ずおきるのでしょうか?
もし防ぐ手段がありましたらご教授お願いいたします。
※以下のソースコードは抜粋ですが、最低限しか組んでいないのでこれで十分かと思いました。
もし、全部必要であれば通知お願いいたします。

XAML

1<Window x:Class="MovieLibTest_Wpf.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:MovieLibTest_Wpf" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="250" Width="680"> 9 <Grid> 10 <Button x:Name="BTN_PLAY" Content="再生" HorizontalAlignment="Left" Margin="128,15,0,0" VerticalAlignment="Top" Width="75" Click="BTN_PLAY_Click"/> 11 <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="180" Margin="10,39,0,0" VerticalAlignment="Top" Width="320"> 12 <MediaElement x:Name="ME_MOVIE1" Stretch="Fill" Width="auto" Height="auto" LoadedBehavior="Manual" UnloadedBehavior="Manual" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 13 </Border> 14 </Grid> 15</Window>

cs

1private void BTN_PLAY_Click(object sender, RoutedEventArgs e) 2{ 3 ME_MOVIE1.Source = new System.Uri(MOVIE_FILE_PATH); 4 ME_MOVIE1.Play(); 5}

###その他
Windows7 pro 64bit
visual studio 2015 pro
動画は、「ライブラリ/ビデオ」配下にあった「サンプルビデオ」の「野生動物.wmv」を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

動画再生には内部的な処理として下準備に結構時間がかかるので、再生ボタン押下でファイルを指定して再生開始する、という方法では、どうしても実際に表示が始まるまでにタイムラグが発生してしまいます。これはMediaElementに限ったことではありません。

そこで、再生を開始する前にあらかじめ(例えばLoadedイベント内で)動画ファイル名をセットしてPauseで待機させます。こうすることで、下準備を終わらせていつでも即座に再生を開始できる状態になります。そして、再生ボタンではPlayメソッドを呼ぶだけにします。

投稿2016/10/06 01:17

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzuki123

2016/10/07 06:04

>そこで、再生を開始する前にあらかじめ(例えばLoadedイベント内で)動画ファイル名をセットしてPauseで待機させます。こうすることで、下準備を終わらせていつでも即座に再生を開始できる状態になります。そして、再生ボタンではPlayメソッドを呼ぶだけにします。  試しに「source」に設定した後、isLoadedがtrueになるまで待機するように作成してみましたが、動画サイズがでかいと(といっても25M程度)現象が発生します。  記載されている「e」はイベント引数のRouteEventArgsの「e」を指しているという事で認識はあっていますか?それっぽいメンバが見当たらなかったので、差し支えなければどのパラメータを使用してロード完了を判断するか教えていただけますでしょうか?  ※軽い動画(700k程度)であれば先頭の黒背景は再現しませんでした。  ※直接メディアプレイヤーで試しても同様の現象が起きました。(これに関しては、MediaElementがMediaPlayerのラッパーだから当たり前だと思いますが)
catsforepaw

2016/10/07 06:17

説明が判りづらかったでしょうか。 LoadedイベントとはMainWindowのイベントのことです。 MainWindowにLoadedイベントハンドラを追加して、その中でMediaElementのSourceを設定し、Pauseメソッドを実行します。Pauseメソッドの実行により動画ファイルの最初の部分がメモリに読み込まれます。 再生ボタンクリックではPlayメソッドを呼ぶだけにします。
suzuki123

2016/10/07 11:30

>LoadedイベントとはMainWindowのイベントのことです。  頂いた情報どおりに試した所、画面起動時点(pauseが処理された時点)で黒が描画。(念のためXAML側はbackground="white"を指定しています。)  その後映像を再生(play)⇒停止(stop)⇒再生(play)と行うと、2回目以降のplayの先頭に黒背景が入りました(現象発生)。  これってMediaPlayerがそもそも重い動画を再生する場合、最初に黒が入る仕様というやつなんでしょうか・・・。  ひょっとしてWPFで動画再生は行わないほうが良いのでしょうか?  ※まぁstop後に描画先を真っ黒にすれば気にはならないかもですが、根本的な「なぜ黒背景が入る?」が解決出来ていないので・・・。
catsforepaw

2016/10/07 12:56

判りました。おそらく`ScrubbingEnabled`プロパティがfalseのままではないでしょうか。それをtrueにすれば初回のPauseで絵が表示されるようになりますし、Pause中のPosition変更で絵が追従するようになります。
suzuki123

2016/10/11 02:42

結論から申します。正直ポカしてました。本当にすみません。 使っていたサンプル動画の1F目にそもそも黒が入れられていました。 なので、動画を1F目から映像を再生されるように加工したものを使用し、 以下を試した所、違いが発生した事が確認できました。 1:ScrubbingEnabled=false、load時pause無し  →初回のplay時は再生までに若干時間(といっても気持ち程度ですが。。。)がかかりました。2回目以降はサクサク 2:ScrubbingEnabled=false、load時pause有り 3:ScrubbingEnabled=true、load時pause有り  →上記2つに関しては、初回のplayからサクサク   ※使用する動画の容量を25mb->2.3Gbに変更して検証 様々な助言ありがとうございました。
guest

0

動画再生系で、細かいことが気になるようでしたら、DirectShowを使うしかないです。
あれなら、デコーダからグラバまで自由に書くことができます。
僕は動画を含む編集ソフトを書くのに1年近くかかりましたが、
今となっては、DirectShowを最初から使っていれば苦労しなかったなーという経験があります。

投稿2016/10/05 21:33

mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzuki123

2016/10/06 01:52

>動画再生系で、細かいことが気になるようでしたら、DirectShowを使うしかないです。 >あれなら、デコーダからグラバまで自由に書くことができます。  恐らくそういった意味で公開されているであろう「DirectShow.Net」や「WPFMediaKit」を発見したので試しに使用してみたのですが、単純に再生するだけ(sourceにパス入れてPlayするだけ)のプログラムを組んだところ、動画のカクつき(コマ落ち?)が酷か ったのです。  mugicya様がDirectShowを使ってこのようなカクつき現象って見た事ありますか?  ※「QuartzTypeLib」はまだ試せていません(恐らくこれらの公開Libも基底部分では同じものを使っているのではと思っています)。
mugicya

2016/10/06 10:31

動画再生は、わりと重いので、PCのスペックによるのかもしれません。 以前、DirectShow.NET を使用して動画の連続再生を継ぎ目無く行ったりしましたが、 標準的な機能だと、どうしても途切れます。 そこで、事前読込みさせて繋ぎ目をスムースにするグラバを書いた記憶があります。 ただ、DirectShowに関しては、資料も少ないので、かなりの試行錯誤が必要になると思います。
suzuki123

2016/10/07 06:09

>事前読込みさせて繋ぎ目をスムースにするグラバを書いた記憶があります。  やはり特殊な事をする場合はフィルタやピンなどを独自に設定できるような作りで行かないと出来ないということですね。  今回みたいな単純に再生するだけだったら公開されているライブラリだけで出来るかなと安易に考えていたのですが、まさかここまで話が広がるとは・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問