First of all I would like to welcome everyone to my new blog and wish you all a happy new year… Through this blog I hope I can provide help, tips and some useful information about common problems we’ve all faced in programming, as well as some sample applications... In my first post I’m going to show you how you can easily create your own custom Media Player which can automatically search for lyrics for the song you’re listening.

To begin, we are going to create a new WPF application (in this demo I am going to use the .NET 4 Framework and Visual Studio 2010, but most of the functions mentioned in this post are also available on .NET 3.5).

The next thing we are going to do is to add 4 buttons and a mediaElement to our MainWindow by dragging them from the toolbox we have available here. These 4 buttons cover the main 4 functions of a media player, play, pause, stop, open. I am not going to give you any instructions on how to “reshape” them as I believe the best GUI is the one you make yourself, so this is up to you.

Let’s open the MainWindow.xaml.cs file now and create the play, pause and stop functions.

.bool fileIsPlaying;
.//play the file
.private void playButton__Click(object sender, RoutedEventArgs e)
.{
. mediaElement.Play();
. fileIsPlaying = true;
.}
.
.
.//pause the file
.private void pauseButton_Click(object sender, RoutedEventArgs e)
.{
. mediaElement.Pause();
. fileIsPlaying = false;
.}
.
.
.//stop the file
.private void stopButton_Click(object sender, RoutedEventArgs e)
.{
. mediaElement.Stop();
. fileIsPlaying = false;
.}

The code behind the open button is a little bit more complex

.private void openFileButton_Click(object sender, RoutedEventArgs e)
. {
. Stream checkStream = null;
. OpenFileDialog dlg = new OpenFileDialog();
. dlg.Filter = "All Supported File Types(*.mp3,*.wav,*.mpeg,*.wmv,*.avi)|*.mp3;*.wav;*.mpeg;*.wmv;*.avi";
. // Show open file dialog box
. if ((bool)dlg.ShowDialog())
. {
. try
. {
. // check if something is selected
. if ((checkStream = dlg.OpenFile()) != null)
. {
. mediaElement.Source = new Uri(dlg.FileName);
. }
. }
. catch (Exception ex)
. {
. MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
. }
. }
. }

You can easily change the file types allowed by users in the OpenFileDialog just by changing this value.

            dlg.Filter = "All Supported File Types (*.mp3,*.wav,*.mpeg,*.wmv,*.avi)|*.mp3;*.wav;*.mpeg;*.wmv;*.avi";

You can also create 2 sliders in order to control the volume and the speed ratio of the playback. You should add these properties into your XAML file :

  • for the speedRatioSlider

    Value="" Maximum="" SmallChange="0.25"
  • for the volumeSlider
    Value="0.5" Maximum="" SmallChange="0.01" LargeChange="0.1"

    So now we’re finally able to edit our c# code and create the events.

    .//change the speed of the playback
    .void speedRatioSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double /> e)
    .{
    . mediaElement.SpeedRatio = speedRatioSlider.Value;
    .
    .}
    .
    .//turn volume up-down
    .private void volumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double /> e)
    .{
    . mediaElement.Volume = volumeSlider.Value;
    .}

    Now there’s one more thing we need to do. We have to create a slide bar attached to this mediaElement to show the progress made. For this task we’re going to need a slider, a progress bar and a Timer to periodically change the values of these elements. First of all we need to create a DispatcherTimer and an event that will occur every 1 second, in order to change the value of the textbox displaying the current progress of the playback.

    .DispatcherTimer timer;
    .
    .public delegate void timerTick();
    .timerTick tick;
    .
    .public MainWindow()
    . {
    . InitializeComponent();
    .
    . timer = new DispatcherTimer();
    . timer.Interval = TimeSpan.FromSeconds();
    . timer.Tick += new EventHandler(timer_Tick);
    . tick = new timerTick(changeStatus);
    .
    . }
    .
    .
    .void timer_Tick(object sender, EventArgs e)
    . {
    . Dispatcher.Invoke(tick);
    . }

    We’ll use the Position property of the mediaElement (which is, though, available only after the mediaElement_MediaOpened event occurs) to change the value of the textbox that displays the current time of the playback.

    .//visualize progressBar
    .//the fileIsPlaying variable is true when the media is playing
    .//and false when the media is paused or stopped
    . void changeStatus()
    . {
    . if (fileIsPlaying)
    . {
    . string sec, min, hours;
    .
    . #region customizeTime
    . if (mediaElement.Position.Seconds < )
    . sec = "" + mediaElement.Position.Seconds.ToString();
    . else
    . sec = mediaElement.Position.Seconds.ToString();
    .
    .
    . if (mediaElement.Position.Minutes < )
    . min = "" + mediaElement.Position.Minutes.ToString();
    . else
    . min = mediaElement.Position.Minutes.ToString();
    .
    . if (mediaElement.Position.Hours < )
    . hours = "" + mediaElement.Position.Hours.ToString();
    . else
    . hours = mediaElement.Position.Hours.ToString();
    .
    . #endregion customizeTime
    .
    . seekSlider.Value = mediaElement.Position.TotalMilliseconds;
    . progressBar.Value = mediaElement.Position.TotalMilliseconds;
    .
    . if (mediaElement.Position.Hours == )
    . {
    .
    . currentTimeTextBlock.Text = min + ":" + sec;
    . }
    . else
    . {
    . currentTimeTextBlock.Text = hours + ":" + min + ":" + sec;
    . }
    . }
    . }

    So now we have the current time displayed on the textbox and the progress of the playback. We have to create the events for the following functions of the seekSlider

    .//seek to desirable position of the file
    .//you will also have to set the moveToPosition property of the seekSlider to
    .//true
    .private void seekSlider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    . {
    . TimeSpan ts = new TimeSpan(, , , , (int)seekSlider.Value);
    .
    . changePostion(ts);
    . }
    .
    .//mouse down on slide bar in order to seek
    . private void seekSlider_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    . {
    . isDragging = true;
    . }
    .
    .private void seekSlider_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    . {
    . if (isDragging)
    . {
    . TimeSpan ts = new TimeSpan(, , , , (int)seekSlider.Value);
    . changePostion(ts);
    . }
    . isDragging = false;
    . }
    .
    .//change position of the file
    .void changePostion(TimeSpan ts)
    .{
    . mediaElement.Position = ts;
    .}

    Finally we need to implement the mediaElement_MediaOpened and mediaElement_MediaEnded functions.

    .
    .
    .
    . //occurs when the file is opened
    . public void mediaElement_MediaOpened(object sender, RoutedEventArgs e)
    . {
    . timer.Start();
    . fileIsPlaying = true;
    . openMedia();
    . }
    .
    .
    . //opens media,adds file to playlist and gets file info
    . public void openMedia()
    . {
    . ......
    . }
    .
    .
    .
    .//occurs when the file is done playing
    .private void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
    . {
    . mediaElement.Stop();
    . volumeSlider.ValueChanged -= new RoutedPropertyChangedEventHandler<double />(volumeSlider_ValueChanged);
    . speedRatioSlider.ValueChanged -= new RoutedPropertyChangedEventHandler<double />(speedRatioSlider_ValueChanged);
    . }

    That’s all for now…We have created our own, fully functional media Player.. You can download the sample code here...I would be happy to read any thoughts or suggestions you might have…

  • 原文链接

Custom Media Player in WPF (Part 1)的更多相关文章

  1. 用VLC Media Player搭建简单的流媒体服务器

    VLC可以作为播放器使用,也可以搭建服务器. 在经历了Helix Server和Darwin Streaming Server+Perl的失败之后,终于找到了一个搭建流媒体简单好用的方法. 这个网址中 ...

  2. android错误之MediaPlayer用法的Media Player called in state *,androidmediaplayer

    用到Media Player,遇到几个问题,记一下 用法就不说了,使用的时候最好参考一下mediaPlayer的这张图 第一个错误是Media Player called in state 8 这个是 ...

  3. win7自带windows media player 已停止工作

    解决方法如下: 在计算机开始,菜单找到控制面板 ,然后打开程序和功能,选择打开或关闭window功能,媒体功能.再取消windows Media Center Windows MediaPlayer选 ...

  4. 转:Media Player Classic - HC 源代码分析

    VC2010 编译 Media Player Classic - Home Cinema (mpc-hc) Media Player Classic - Home Cinema (mpc-hc)播放器 ...

  5. Media Player 把光盘中的内容拷贝出来的方法

    http://jingyan.baidu.com/article/cb5d610529f0c1005c2fe0b4.html  这个链接是通过Media  Player 把光盘中的内容拷贝出来的方法h ...

  6. 20 Free Open Source Web Media Player Apps

    free Media Players (Free MP3, Video, and Music Player ...) are cool because they let web developers ...

  7. Windows Media Player安装了却不能播放网页上的视频

    前段时间遇到Windows Media Player安装了却不能播放网页上的视频的问题,在网上查找资料时,发现大部分资料都没能解决我这个问题.偶尔试了网上一牛人的方法,后来竟然解决了.现在再找那个网页 ...

  8. 如何在Windows中打开多个Windows Media Player

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何在Windows中打开多个Windows Media Player.

  9. Windows Media Player axWindowsMediaPlayer1 分类: C# 2014-07-28 12:04 195人阅读 评论(0) 收藏

    属性/方法名: 说明: [基本属性] URL:String; 指定媒体位置,本机或网络地址 uiMode:String; 播放器界面模式,可为Full, Mini, None, Invisible p ...

随机推荐

  1. oracle 之数据字典屣履造门。

     oracle 之数据字典屣履造门.(更新中)       今天是2013-06-20,哎,写这篇笔记的时候,我发现我是一个非常懒惰的人,这篇文章本该昨天就完成的,想起了钱鹤滩的<明日歌> ...

  2. Tomcat 配置WEB虚拟映射 及 配置虚拟主机

    Tomcat  配置WEB虚拟映射 及 配置虚拟主机 配置WEB虚拟映射文件夹有三种方法例如以下: 第一(要重新启动server的): 打开路径 Tomcat 6.0\conf 下的 server.x ...

  3. Delphi中获取Unix时间戳及注意事项(c语言中time()是按格林威治时间计算的,比北京时间多了8小时)

    uses DateUtils;DateTimeToUnix(Now) 可以转换到unix时间,但是注意的是,它得到的时间比c语言中time()得到的时间大了8*60*60这是因为Now是当前时区的时间 ...

  4. Codeforces Round #235 (Div. 2) D. Roman and Numbers (数位dp、状态压缩)

    D. Roman and Numbers time limit per test 4 seconds memory limit per test 512 megabytes input standar ...

  5. FindWindowEx使用方法

    函数功能:该函数获得一个窗体的句柄,该窗体的类名和窗体名与给定的字符串相匹配.这个函数查找子窗体,从排在给定的子窗体后面的下一个子窗体開始.在查找时不区分大写和小写. 函数原型:HWND FindWi ...

  6. 【LeetCode】Min Stack 解题报告

    [题目] Design a stack that supports push, pop, top, and retrieving the minimum element in constant tim ...

  7. Gulp.js简介

    Gulp.js简介 我们讨论了很多关于怎么减少页面体积,提高重网站性能的方法.有些是操作是一劳永逸的,如开启服务器的gzip压缩,使用适当的图片格式,或删除一些不必要的字符.但有一些任务是每次工作都必 ...

  8. pinyin4j的使用

    pinyin4j的使用   pinyin4j是一个功能强悍的汉语拼音工具包,主要是从汉语获取各种格式和需求的拼音,功能强悍,下面看看如何使用pinyin4j.     import net.sourc ...

  9. Fitnesse使用系列二

    决策表 Fitnesse中提供了好几种表格样式,前面说了.表格是运行測试的关键.从字面看.表格描写叙述的是測试用例.从运行角度看,表格为后端的代码(fitnesse里称作fixture)提供了包名.类 ...

  10. HTML5初步——新的表单元素和属性

    HTML5初步--新的表单元素和属性 HTML5初步--新的表单元素和属性 <!DOCTYPE html> <html> <head> <meta chars ...