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