첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ MediaPlayer 클래스 : 재생하기

------------------------------------------------------------------------------------------------------------------------

using System;

using System.Threading;

using System.Windows;

using System.Windows.Media;

using System.Windows.Media.Imaging;

 

...

 

/// <summary>

/// 미디어 오픈 여부

/// </summary>

private bool isMediaOpened = false;

 

/// <summary>

/// 미디어 실패 여부

/// </summary>

private bool isMediaFailed = false;

 

...

 

#region 미디어 플레이어 미디어 오픈시 처리하기 - mediaPlayer_MediaOpened(sender, e)

 

/// <summary>

/// 미디어 플레이어 미디어 오픈시 처리하기

/// </summary>

/// <param name="sender">이벤트 발생자</param>

/// <param name="e">이벤트 인자</param>

private void mediaPlayer_MediaOpened(object sender, EventArgs e)

{

    this.isMediaOpened = true;

}

 

#endregion

 

#region 미디어 플레이어 미디어 실패시 처리하기 - mediaPlayer_MediaFailed(sender, e)

 

/// <summary>

/// 미디어 플레이어 미디어 실패시 처리하기

/// </summary>

/// <param name="sender">이벤트 발생자</param>

/// <param name="e">이벤트 인자</param>

private void mediaPlayer_MediaFailed(object sender, ExceptionEventArgs e)

{

    this.isMediaFailed = true;

}

 

#endregion

 

...

 

private MediaPlayer mediaPlayer = new MediaPlayer();

 

...

 

this.mediaPlayer.ScrubbingEnabled = true;

 

this.mediaPlayer.MediaOpened += new EventHandler(mediaPlayer_MediaOpened);

this.mediaPlayer.MediaFailed += new EventHandler<ExceptionEventArgs>(mediaPlayer_MediaFailed);

 

Uri sourceURI = new Uri("c:\\sample.avi");

 

this.mediaPlayer.Open(sourceURI);

 

while(this.isMediaOpened == this.isMediaFailed)

{

    this.mediaPlayer.Dispatcher.Invoke(new Action(delegate { Thread.Sleep(10); }));

}

 

if(this.isMediaFailed)

{

    // 미디어 파일을 오픈할 수 없는 경우를 처리한다.

    MessageBox.Show("Failed");

 

    return;

}

 

Size videoSize = CalculateVideoSize(this.mediaPlayer, 800, 600);

 

// MediaPlayer 객체를 소스로 사용하는 컨테이너에서 필요한 경우 비디오 크기를 설정한다.

// this.videoDrawing.Rect = new Rect(0, 0, pVideoSize.Width, pVideoSize.Height);

 

this.mediaPlayer.Play();

 

...

 

#region 비디오 크기 구하기 - GetVideoSize(mediaPlayer, sourceSize, maximumSize)

 

/// <summary>

/// 비디오 크기 계산하기

/// </summary>

/// <param name="mediaPlayer">MediaPlayer 객체</param>

/// <param name="sourceSize">소스 크기</param>

/// <param name="maximumSize">최대 크기</param>

/// <returns>비디오 크기</returns>

/// <remarks>비디오 크기는 Double형 Size 타입이나 픽셀 값이다</remarks>

private Size GetVideoSize(MediaPlayer mediaPlayer, Size maximumSize)

{

    Size videoSize = new Size();

 

    if(mediaPlayer.NaturalVideoWidth > mediaPlayer.NaturalVideoHeight)

    {

        double videoRatio = (double)mediaPlayer.NaturalVideoHeight / mediaPlayer.NaturalVideoWidth;

 

        videoSize.Width  = Math.Min(maximumSize.Width, mediaPlayer.NaturalVideoWidth);

        videoSize.Height = videoSize.Width * videoRatio;

    }

    else

    {

        double videoRatio = (double)mediaPlayer.NaturalVideoWidth / mediaPlayer.NaturalVideoHeight;

 

        videoSize.Height = Math.Min(maximumSize.Height, mediaPlayer.NaturalVideoHeight);

        videoSize.Width  = videoSize.Height * videoRatio;

    }

 

    return videoSize;

}

 

#endregion

#region 비디오 크기 구하기 - GetVideoSize(mediaPlayer, sourceSize, maximumWidth, maximumHeight)

 

/// <summary>

/// 비디오 크기 구하기

/// </summary>

/// <param name="mediaPlayer">MediaPlayer 객체</param>

/// <param name="sourceSize">소스 크기</param>

/// <param name="maximumWidth">최대 너비</param>

/// <param name="maximumHeight">최대 높이</param>

/// <returns>비디오 크기</returns>

/// <remarks>비디오 크기는 Double형 Size 타입이나 픽셀 값이다</remarks>

private Size GetVideoSize(MediaPlayer mediaPlayer, double maximumWidth, double maximumHeight)

{

    return GetVideoSize(mediaPlayer, new Size(maximumWidth, maximumHeight));

}

 

#endregion

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요