이 부분에 대해서 방법을 찾고 있는데 현재는 미디어 플레이어의 rate를 설정하는 것처럼 실버라이트2에선 재생 속도를 변경하는 방법이 없는 것 같습니다. 꽁수로 재생시간을 조금씩 더 해보았는데 자연스럽지 않고 소리가 끊기면서 나와 옛날 비디오의 빨리감기를 보는 정도까지만 가능했습니다. 아래는 관련부분 소스입니다.
ChangeSpeed()에서 mediaPlayer.Pause()와 mediaPlayer.Play()를 하지않고 빨리보기를 하면 어느정도 괜찮게 보이지만 역시 소리 부분은 부드럽게 재생이 안되네요. Position을 다시 설정하는 부분에 부하가 있어 밀리세컨드 단위의 세세한 제어는 힘든 것 같습니다. 또한 Progressive Download가 아닌 Streaming일 경우에는 저 방법으로는 대책이 없습니다. 저만 방법을 모르고 삽질중이라는 불길한 예감도 듭니다. ㅠㅠ
static double TIMER_INTERVAL = 300;
static double MOVE_MSECONDS = 10000;
static int MOVE_FF = 1;
static int MOVE_RW = -1;
public Page()
{
/** 타이머 설정 */
timerStoryboard.BeginTime = TimeSpan.Zero;
timerStoryboard.Duration = new Duration(TimeSpan.FromMilliseconds(TIMER_INTERVAL));
timerStoryboard.Completed += new EventHandler(timerCompleted);
}
private void ChangeSpeed()
{
if (playSpeed == 0)
return;
double currentPos = mediaPlayer.Position.TotalMilliseconds;
double newPos = currentPos + (MOVE_MSECONDS * playSpeed);
double maxPos = mediaPlayer.NaturalDuration.TimeSpan.TotalMilliseconds;
double downloadPos = Math.Floor(mediaPlayer.DownloadProgress * maxPos);
mediaPlayer.Pause();
/* 유효범위 검사 */
if (newPos >= 0 && newPos < downloadPos)
{
mediaPlayer.Position = TimeSpan.FromMilliseconds(newPos);
mediaPlayer.Play();
timerStoryboard.Begin();
}
else
{
playSpeed = 0;
}
}
static double MOVE_MSECONDS = 10000;
static int MOVE_FF = 1;
static int MOVE_RW = -1;
public Page()
{
/** 타이머 설정 */
timerStoryboard.BeginTime = TimeSpan.Zero;
timerStoryboard.Duration = new Duration(TimeSpan.FromMilliseconds(TIMER_INTERVAL));
timerStoryboard.Completed += new EventHandler(timerCompleted);
}
private void ChangeSpeed()
{
if (playSpeed == 0)
return;
double currentPos = mediaPlayer.Position.TotalMilliseconds;
double newPos = currentPos + (MOVE_MSECONDS * playSpeed);
double maxPos = mediaPlayer.NaturalDuration.TimeSpan.TotalMilliseconds;
double downloadPos = Math.Floor(mediaPlayer.DownloadProgress * maxPos);
mediaPlayer.Pause();
/* 유효범위 검사 */
if (newPos >= 0 && newPos < downloadPos)
{
mediaPlayer.Position = TimeSpan.FromMilliseconds(newPos);
mediaPlayer.Play();
timerStoryboard.Begin();
}
else
{
playSpeed = 0;
}
}
private void timerCompleted(object sender, EventArgs e)
{
ChangeSpeed();
}
/** 뒤로보기 클릭 */
private void btnRewind_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
playSpeed = MOVE_RW;
ChangeSpeed();
}
/** 빨리보기 클릭 */
private void btnFast_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
playSpeed = MOVE_FF;
ChangeSpeed();
}
{
ChangeSpeed();
}
/** 뒤로보기 클릭 */
private void btnRewind_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
playSpeed = MOVE_RW;
ChangeSpeed();
}
/** 빨리보기 클릭 */
private void btnFast_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
playSpeed = MOVE_FF;
ChangeSpeed();
}
ChangeSpeed()에서 mediaPlayer.Pause()와 mediaPlayer.Play()를 하지않고 빨리보기를 하면 어느정도 괜찮게 보이지만 역시 소리 부분은 부드럽게 재생이 안되네요. Position을 다시 설정하는 부분에 부하가 있어 밀리세컨드 단위의 세세한 제어는 힘든 것 같습니다. 또한 Progressive Download가 아닌 Streaming일 경우에는 저 방법으로는 대책이 없습니다. 저만 방법을 모르고 삽질중이라는 불길한 예감도 듭니다. ㅠㅠ
'기타' 카테고리의 다른 글
아이폰 3GS (2) | 2009.09.17 |
---|---|
블로그를 또 다시 이전했습니다. (4) | 2009.05.11 |
sqlite3 둘러보기 (3) | 2009.02.02 |
버그추적 시스템 Mantis 설치 (6) | 2009.01.07 |
애플스크립트(AppleScript) 둘러보기 (5) | 2009.01.06 |