본문 바로가기
C# /SmartClient

MediaPlayerClass 를 이용한 간단한 미디어 플레이어(wav,mp3 재생)

by Hwoarang757 2014. 7. 8.

실력자 분들에게는 형편 없는 게시글 죄송합니다 ...그래도 올려봅니다 ;;

 

 

 

컨트롤의 배치는 UI도 간단하며

 

참조는

Microsoft.DirectX.AudioVideoPlayback  ( 전체 재생시간만 구하는 역할)COM Windows Media Player - msdxm.tlb 를 참조하였습니다.

 

TrackBar의 움직임이 Timer를 이용하여 1초마다 Tick을 발생시켜 움직임이 부자연스럽습니다 -_-;;

 

파일의 총 재생시간은 Microsoft.DirectX.AudioVideoPlayback 의 클래스를 이용하여 구하였습니다.

(미디어 플레이어 클래스에서는 총 재생시간을 못찾겠습니다 크흑 )

 

MediaPlayer 클래스의 메모리 해제 방법을 못찾겠습니다.

창을 죽여도 음원은 계속 재생이 되서 예외가 발생하는 오픈 Path를 설정하엿습니다 ㅠㅠ

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Windows;
using System.IO;
//using Microsoft.DirectX.AudioVideoPlayback;
//using MediaPlayer;



namespace SmartClient_AudioPlayer
{
	public partial class MediaSoundPlayer : UserControl 
    {
    	MediaPlayer.MediaPlayerClass player;
        public MediaSoundPlayer()
        {
        	InitializeComponent();
            player = new MediaPlayer.MediaPlayerClass();
		}
        ~MediaSoundPlayer()
        {
        
        }
        
        private void MediaSoundPlayer_Load(object sender, EventArgs e)
        {
          lblRateSpeed.Text = "";
        }

        private string __filePath = string.Empty;

        public void StartAudioPlay(string _filePath) {
          lblAddDurationTime.Text = "";
          string filePath = _filePath;

          if (!File.Exists(filePath))
          {
              return;
          }
          this.__filePath = filePath;
          using (Audio fileDuration = new Audio(filePath)) {
              double playDuration = 0;
              playDuration = fileDuration.Duration;
              DateTime allDuationTime = new DateTime();
              allDuationTime = allDuationTime.AddSeconds(playDuration);//총 시간을 구해준다.
              lblDurationAllTime.Text = allDuationTime.ToString("HH:mm:ss");//파일네임을 표시해준다.
              lblFileName.Text = filePath;

              trackBarVolumn.SetRange(player.Volume, 0);
              trackBarVolumn.Value = player.Volume;

              trackBarDuration.SetRange(0, int.Parse(Math.Truncate((playDuration + 1)).ToString()));

              };
           player.Open(_filePath);
           player.Stop();
           AudioPlay(0);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="durationStartValue"></param>
        private void AudioPlay(int durationStartValue)
        {
            //스크롤이 움직인곳에서 다시 포인트를 움직이기 시작한다.
            trackBarDuration.Value = durationStartValue;
            timer.Enabled = true;
            timer.Interval = 1000;
            //TrackBar를 움직이기 시작한다.
            timer.Start();
            //Wave 파일 재생을 시작한다.
            if (player.PlayState == MediaPlayer.MPPlayStateConstants.mpPlaying || player.PlayState == MediaPlayer.MPPlayStateConstants.mpScanForward || player.PlayState == MediaPlayer.MPPlayStateConstants.mpScanReverse)
            {
                player.CurrentPosition = Double.Parse(durationStartValue.ToString());
                player.Play();
            } else {
                //player.CurrentPosition = Double.Parse(durationStartValue.ToString());
                player.Play();
            }
            SetRateValue();
          }


      private void btnPlay_Click(object sender, EventArgs e)
      {
          if (trackBarDuration.Value >= trackBarDuration.Maximum)
          {
              trackBarDuration.Value = 0;
              player.CurrentPosition = 0;
              player.Play();
              timer.Start();
          } else {
              player.Play();
              timer.Start();
          }
       }

      /// <summary>
      /// 타이머의 Tick 이벤트가 1초씩 발생할때마다 Label의 시간증가와 트랙바의 Value를 증가시켜준다.
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      public void timer_Tick(object sender, EventArgs e)
      {	
          DateTime DurationTime = new DateTime();
          DurationTime = DurationTime.AddSeconds(Double.Parse(trackBarDuration.Value.ToString()));
          lblAddDurationTime.Text = DurationTime.ToString("HH:mm:ss");

          trackBarDuration.Value = trackBarDuration.Value + 1;
      }

      /// <summary>
      /// Duration TrackBar의 값이 변경될때마다 이벤트가 발생한다.
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void trackBarDuration_ValueChanged(object sender, EventArgs e)
      {
          if (trackBarDuration.Maximum <= trackBarDuration.Value)
          {
              timer.Stop();
          }
      }

      /// <summary>
      /// Duration TrackBar의 스크롤을 제어할때마다 이벤트가 발생한다.
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void trackBarDuration_Scroll(object sender, EventArgs e)
      {
          AudioPlay(trackBarDuration.Value);
       }

       /// <summary>
       /// 볼륨을 조정할 때 이벤트가 발생합니다.
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void trackBarVolumn_Scroll(object sender, EventArgs e)
       {
          player.Volume = trackBarVolumn.Value;
       }

      /// <summary>
      /// 재생간격을 조정할때 발생합니다.
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void trackBarRateSpeed_Scroll(object sender, EventArgs e)
      {

      }

      private void btnPause_Click(object sender, EventArgs e)
      {
          player.Pause();
          timer.Stop();
          timer.Enabled = false;
      }

      private void btnStop_Click(object sender, EventArgs e)
      {	
          player.Stop();
          timer.Stop();
          timer.Enabled = false;
          trackBarDuration.Value = trackBarDuration.Minimum;
      }

      public void StopAudioPlay()
      {
          player.Open("");
          player.FileName = "";
          player = null;

          if (File.Exists(__filePath))
          {
              FileInfo fi = new FileInfo(__filePath);
              fi.Delete();
          }
          this.Dispose(true);
          Application.Exit();
      }

      private void trackBarRateSpeed_ValueChanged(object sender, EventArgs e)
      {
          SetRateValue();
      }

      public void SetRateValue(){
          switch (trackBarRateSpeed.Value)
          {
              case 1: lblRateSpeed.Text = "1 배속";
                      player.Rate = 1;
                      timer.Interval = 1000;
                      break;
              case 2: lblRateSpeed.Text = "1.1 배속";
                      player.Rate = 1.1;
                      timer.Interval = 900;
                      break;
              case 3: lblRateSpeed.Text = "1.2 배속";
                      player.Rate = 1.2;
                      timer.Interval = 800;
                      break;
              case 4: lblRateSpeed.Text = "1.3 배속";
                      player.Rate = 1.3;
                      timer.Interval = 700;
                      break;
              case 5: lblRateSpeed.Text = "1.4 배속";
                      player.Rate = 1.4;
                      timer.Interval = 600;
                      break;
              case 6: lblRateSpeed.Text = "1.5 배속";
                      player.Rate = 1.5;
                      timer.Interval = 500;
                      break;
              case 7: lblRateSpeed.Text = "1.6 배속";
                      player.Rate = 1.6;
                      timer.Interval = 400;
                      break;
              case 8: lblRateSpeed.Text = "1.7 배속";
                      player.Rate = 1.7;
                      timer.Interval = 300;break;
            }
      }

      private void MediaSoundPlayer_Leave(object sender, EventArgs e){

      }
	}
}