주요 클래스

 

 

MediaElement – 오디오 및 비디오를 컨트롤 할 수 있게 해주는 클래스

 

- 미디어를 대화형으로 중지, 일시 중지 및 재생할 수 있으려면 MediaElementLoadedBehavior속성을 Manual로 설정해야 합니다

 

 

 

MediaTimeline - MediaTimeline은 해당 영상 Timeline 개체에서 영상을 제어하는 것과 같은 방식으로 미디어 타이밍에 대한 제어를 제공하는 개체

 

- MediaTimeline에는 연결된 Duration BeginTime 속성이 있으며 이 속성을 사용하여 미디어의 시작 시간재생 시간을 지정할 수 있다.

 

 

 

MediaClock - 미디어의 타이밍 상태를 유지 관리한다.

 

 

 

 

클래스간의 연동

 

 

- MediaTimeline 개체에서 생성된 Clock개체를 생성해서 MediaClock으로 값을 대입해주고 MediaClock MediaElement와 연결 시켜준다.

 

)

1. MediaClock  mc =  MediaTimeline.CreateClock();

 

2. mediaelement.Clock = mc;

 

당연히 위에 타임라인에서 클락을 생성할 때 타임라인에는 기본적인 정보들이 들어가 있어야 한다.

 

 

 

 

 

미디어플레이어만들기

 

 

1.     미디어가 정보들이 셋팅되어서 열릴 준비가 되었을 때

 

타임슬라이더바에 전체시간 적용

private void mediaElement1_MediaOpened(object sender, RoutedEventArgs e)

        {           

            timebar.Maximum = mediaElement1.NaturalDuration.TimeSpan.TotalMilliseconds;

}

 

 

 

2.     미디어를 열 때

 

파일을 열고 클락과 엘리먼트를 연동시켜준 후 이벤트를 등록한다.

private void open_Click(object sender, RoutedEventArgs e)

        {           

            ofd = new OpenFileDialog(); 

            ofd.Filter = "Media file (*.*)|*.*"; //파일 필터링

           

            ofd.ShowDialog();  //다이얼로그 박스 띄우기

            try

            {

                volume_slider.Value = 0.5;

                Uri uri = new Uri(ofd.FileName); //선택한 파일 데이터타입 uri로 형변환

                                        

                volume_slider.Value = mediaElement1.Volume * 10;

 

                timeline.Source = uri;

                TimeSpan tp = new TimeSpan(0, 0, 0);

                timeline.BeginTime = tp;

                timeline.Duration = mediaElement1.NaturalDuration;

               

                mc = timeline.CreateClock();                               

                mediaElement1.Clock = mc;

               

                mc.CurrentTimeInvalidated += new EventHandler(_CurrentTimeInvaildated);

               //미디어 타임이벤트 등록

            }

            catch { }

        }

 

 

 

 

 

 

3.     미디어타임 이벤트 발생시

 

시간변경시 타임슬라이더바 값 변경

private void _CurrentTimeInvaildated(object sender, EventArgs e)

        {

           timebar.Value = mediaElement1.Position.TotalMilliseconds;                                

        }

 

 

 

4.     타임슬라이더 위치 수동으로 변화시

 

마우스 끌어서 슬라이더바 특정시간으로 옮기기

private void timebar_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)

        {           

           int SliderValue = (int)timebar.Value;                           

 

           TimeSpan ts = new TimeSpan(0, 0, 0, 0, SliderValue);

 

           try

           {

               mediaElement1.Position = ts;    //위치변화              

           }

           catch { }

 

           mediaElement1.Clock.Controller.Resume();          

        }       

       

        

        private void timebar_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        {

            mediaElement1.Clock.Controller.Pause();

        }

사실 위와같이 하면 포지션의 위치가 바껴야되는게 맞지만 클락과 엘리먼트가 연동되있는 상태에서는 이것이 안되는걸 발견하였다.

 

이러한 오류가발생한다.

미디어 플레이어에 클럭이 지정되는 동안 이 작업을 수행할 수 없습니다

그래서 이것을 해결하기위해 미디어를 정지시켜놓고도 해보고  클락을 해제했다가도 해보고 여러가지 방법을 써봤지만 해결을 못하였다.

 

결론은 일단은 클락을 연동안시키고 해결하는 방법밖에 없다. 그러면 슬라이더바만을 특정시간으로 이동시킬수 있다.

 

방법이 있겠지만 아직 해결못하여서 해결되게되면 업데이트 하겠다.

5.     재생, 정지, 잠시멈춤, 다시재생

 

 


private void button1_Click(object sender, RoutedEventArgs e)

        {

            mediaElement1.Clock.Controller.Begin();           

        }

 

        private void stop_Click(object sender, RoutedEventArgs e)

        {

            mediaElement1.Clock.Controller.Stop();

           

            timebar.Value = 0;

           

        }

 

        private void pause_Click(object sender, RoutedEventArgs e)

        {

            mediaElement1.Clock.Controller.Pause();

        }

 

        private void pause_r_Click(object sender, RoutedEventArgs e)

        {

            mediaElement1.Clock.Controller.Resume();

        }

 

 

 

TIP – 위에서는 타임슬라이더 연동하는것만 나왔는데 볼륨슬라이더도 있다. 볼륨슬라이더는 아주 쉬운 방법으로 영상과 연동시켰다.

 

XAML 코드에 바인딩만 추가 하면 된다.

 

Value="{Binding ElementName=mediaElement1 , Path=Position, Mode=TwoWay}"

 

 
시간이 되면 못다한 기능들을 더 추가해야겠다!~!
 

 

 

 

Posted by 아몰라

댓글을 달아 주세요

  1. 2016.01.26 19:50 신고

    저도 똑같이 미디어플레이어에 클럭 넣었더니 컨트롤이 안되다가 방법을 찾았는데 해결하실 것 같아서 댓글 남겨봅니다.

    미디어 플레이어에 ScrubbingEnabled=True 참으로 허용해주시고, mediaElement.Clock.Controller.Seek(TimeSpan.FromMilliseconds(M_milliseconds), TimeSeekOrigin.BeginTime) 로 position을 변경할 수 있습니다.

    http://stackoverflow.com/questions/2993733/creating-a-simple-seeking-media-player-with-mediaelement-in-wpf

이전버튼 1 2 3 4 5 6 이전버튼