2017-05-05 13 views
0

私は以下のコメントがあります。私はApplication.DoEvents()を呼び出すことなくそれを行うためのより良い方法を探しています。だから、MediaPlayerが正しく開くのを待つ方法

public class Player : IDisposable 
{      
    public bool IsOpen 
    { 
     get; private set; 
    } 
    ///Opens the media player. This is very fast, but the actually opening takes a bit longer. 
    ///When it does open, it fires the MediaPlayer_MediaOpened event 
    public bool Open(string fileName) 
    { 
      // close previous file 
      Close(); 

      mediaPlayer = new MediaPlayer(); 
      mediaPlayer.ScrubbingEnabled = true; 
      mediaPlayer.MediaOpened += MediaPlayer_MediaOpened; 
      mediaPlayer.Open(new Uri(fileName)); 


      return true; 
    } 
    /// <summary> 
    /// Fires when the MediaPlayer has finished opening. 
    /// </summary> 
    private void MediaPlayer_MediaOpened(object sender, EventArgs e) 
    { 
     totalMilliseconds = mediaPlayer.NaturalDuration.TimeSpan.TotalMilliseconds; 
     //40.00 represents 25 frames a second. 
     int totFrames = (int)(totalMilliseconds/40.00); 
     framePixels = new uint[mediaPlayer.NaturalVideoWidth * mediaPlayer.NaturalVideoHeight]; 
     previousFramePixels = new uint[framePixels.Length]; 
     for (int i = 0; i < totFrames; i++) 
      totalFrames.Add(TimeSpan.FromMilliseconds((((2 * i) + 1) * totalMilliseconds)/(2 * totFrames))); 
     IsOpen = true; 
    }   
} 

私は、オブジェクトを作成し、それを開いたとき、私はグラブフレームのように、何かを行うことができます前に解雇することMediaOpenイベントを待つ必要があります。これは私が下で待っている方法です。これは私が好きではなく、やりたいことです。

ご協力いただきありがとうございます。

+0

'MediaOpen'がイベントであれば、代わりにポーリングの' IsOpen'性質、(イベントハンドラを追加します)そのイベントをサブスクライブし、そこから実行を続行します(つまり、 'IsOpen'をtrueに設定した' GetNextFrame'部分を上に移動し、ループを完全に省略します)。 – dlatikay

+0

それに当てはまるなら、それは私がやることです。しかし、実際にはこれらのうちの7つを開いているので、扱いにくくなる可能性があります。 – user7049117

答えて

0

私はこのコードをコンパイルしようとはしませんでしたが、それはあなたに役立つと思います。その後、

public class Player : IDisposable 
{      
public bool IsOpen 
{ 
    get; private set; 
} 

///You have to return a task to run this code asynchronously 
public Task Open(string fileName) 
{ 
     // close previous file 
     Close(); 

     mediaPlayer = new MediaPlayer(); 
     mediaPlayer.ScrubbingEnabled = true; 
     mediaPlayer.MediaOpened += MediaPlayer_MediaOpened; 

     return Task.Run(mediaPlayer.Open(new Uri(fileName))); 
} 
/// <summary> 
/// Fires when the MediaPlayer has finished opening. 
/// </summary> 
private void MediaPlayer_MediaOpened(object sender, EventArgs e) 
{ 
    totalMilliseconds = mediaPlayer.NaturalDuration.TimeSpan.TotalMilliseconds; 
    //40.00 represents 25 frames a second. 
    int totFrames = (int)(totalMilliseconds/40.00); 
    framePixels = new uint[mediaPlayer.NaturalVideoWidth * mediaPlayer.NaturalVideoHeight]; 
    previousFramePixels = new uint[framePixels.Length]; 
    for (int i = 0; i < totFrames; i++) { 
     totalFrames.Add(TimeSpan.FromMilliseconds((((2 * i) + 1) * totalMilliseconds)/(2 * totFrames))); 
     IsOpen = true; 
    }   
} 

player = new Player(); 
    //The program wait the player to open before continuing 
    //you'll need to add the async keyword on the signature method containing this code. 
    await player.Open("C:\\FileName.avi"); 

    Bitmap b = player.GetNextFrame(); 

よりressources herehere

関連する問題