none
关于MediaPlayer类的三个问题和一个额外问题 RRS feed

  • 问题

  • 1.我用设置Position属性的方式来改变当前进度,对于比较长的媒体文件,每次修改后都会额外向后面跳一段时间,比如2小时的电影会跳10秒左右,并且这个时间变化还比较大,短的媒体文件误差就看不出来,请问怎样解决这个问题?

    2.装了解码器之后,WMP12已可以播放多种格式的多媒体文件,有没有可能让MediaPlayer类也能利用到解码器?

    3.怎样实现暂停和停止状态下改变进度位置,界面会改变为相应位置的帧画面?在此基础上,怎样预览指定进度处的帧画面?我想到的办法是用另一个隐藏的MediaPlayer来播放指定位置的帧,但感觉这样性能损失比较大,想了解有没有比较正统的方法。

    PS:还有个题外话,这是上次解决的一个问题:http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/e7b1f529-b70d-4ebe-8fe0-10289d89e44c/,这个链接的答案解决了获取指定文件图标的问题,后来想起来忘记问了,能否获得驱动器和文件夹的图标?

    谢谢大家对这四个问题的关注

    2011年6月14日 15:42

答案

  • 1. WPF中使用MediaPlayer类 实际是一个整合技术的问题,WPF本身仅提供了MediaElement类(当然,据我联系产品组得到消息,这个并不推荐使用在实际产品中,因为问题较多),而你所说的MediaPlayer应该是通过WindowsFormHost去Host了一个MediaPlayer的ActiveX组件。这个就和winform中操作媒体播放器一致了。

    回答你的第一个问题,你首先要知道你所播放的媒体是怎么编码的,是否有同步帧? 是否是流媒体? 一般有同步帧的媒体,在快速定位的时候,他内部会首先找到最近的同步帧,然后根据同步帧先解码出那一帧的图像,然后根据实际位置的偏移来渲染当前你请求的帧。 而对于没有同步帧的媒体,则需要更多的时间来进行偏移计算。 对于流媒体,则还需要进行下载和缓冲,更需要时间。 所以第一个问题,对于我们开发人员是很难介入的,不过你可以试试安装一些较好的编码解码器,轻量级别的 快速的。 (个人推荐。国产的 完美解码,他整合了很多解码器,你可以试试)

     

    2。装了解码器,WMP12能放了,MediaPlayer也就能放了,他们两者使用的是同一个核心部件。

    3。看下面的这个文章 http://www.dotnetspark.com/kb/1907-seek-bar-for-media-element-wpf.aspx 是对于MediaElement 的。不过要想预览,也是要媒体文件本身支持的,如同需要同步帧一样,

     

    综上,我这里还是另外推荐你看下下面这个项目,会对你在WPF中使用媒体又帮助,WPF MediaKit: http://wpfmediakit.codeplex.com/

     

    最后的那个问题,文件夹的图标信息是写在文件夹内的一个名字为 desktop.ini 的隐藏配置文件里的,例如下面的信息:

    [.ShellClassInfo]
    IconResource=C:\Windows\system32\SHELL32.dll,2

    驱动器的图标默认的你可以从 %SystemRoot%\system32\SHELL32.dll 中找到,如果有人通过注册表修改过驱动器图标,你可以从注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons 里面找到。

     

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月16日 5:14
    版主
  • Well, 那么还是MediaElement其实。对于rmvb 还是不建议使用WMP相关的组件,本身rmvb格式属于私有规范,Windows Media Player就没有很好的支持, 他的相关ActiveX就根本不能支持。 所以你方不了rmvb。

     

    看这位大哥写得例子吧,http://www.cnblogs.com/gnielee/archive/2010/05/06/wpf4-media-player-mediaelement.html 简单的用WPF做个播放器,放放 WMV AVI什么没什么问题。

     

    PS: 那个回车的问题,我在论坛这么久,也是最近发现, 没办法属于论坛编辑器的问题,好像是HTML自动格式的问题,有时候你从别的地方复制内容过来,就会发生,这个时候只能把你当前的内容复制到写字板,清空然后再粘贴回来。

    我们做论坛支持基本上都是在文本编辑器中写好一次性复制过来的,以防写了一半,内容被刷新掉。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月17日 6:21
    版主

全部回复

  • 1. WPF中使用MediaPlayer类 实际是一个整合技术的问题,WPF本身仅提供了MediaElement类(当然,据我联系产品组得到消息,这个并不推荐使用在实际产品中,因为问题较多),而你所说的MediaPlayer应该是通过WindowsFormHost去Host了一个MediaPlayer的ActiveX组件。这个就和winform中操作媒体播放器一致了。

    回答你的第一个问题,你首先要知道你所播放的媒体是怎么编码的,是否有同步帧? 是否是流媒体? 一般有同步帧的媒体,在快速定位的时候,他内部会首先找到最近的同步帧,然后根据同步帧先解码出那一帧的图像,然后根据实际位置的偏移来渲染当前你请求的帧。 而对于没有同步帧的媒体,则需要更多的时间来进行偏移计算。 对于流媒体,则还需要进行下载和缓冲,更需要时间。 所以第一个问题,对于我们开发人员是很难介入的,不过你可以试试安装一些较好的编码解码器,轻量级别的 快速的。 (个人推荐。国产的 完美解码,他整合了很多解码器,你可以试试)

     

    2。装了解码器,WMP12能放了,MediaPlayer也就能放了,他们两者使用的是同一个核心部件。

    3。看下面的这个文章 http://www.dotnetspark.com/kb/1907-seek-bar-for-media-element-wpf.aspx 是对于MediaElement 的。不过要想预览,也是要媒体文件本身支持的,如同需要同步帧一样,

     

    综上,我这里还是另外推荐你看下下面这个项目,会对你在WPF中使用媒体又帮助,WPF MediaKit: http://wpfmediakit.codeplex.com/

     

    最后的那个问题,文件夹的图标信息是写在文件夹内的一个名字为 desktop.ini 的隐藏配置文件里的,例如下面的信息:

    [.ShellClassInfo]
    IconResource=C:\Windows\system32\SHELL32.dll,2

    驱动器的图标默认的你可以从 %SystemRoot%\system32\SHELL32.dll 中找到,如果有人通过注册表修改过驱动器图标,你可以从注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons 里面找到。

     

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月16日 5:14
    版主
  • 我用的是 WPF 里的 System.Windows.Media.MediaPlayer 类,MSDN 上面的描述是 http://msdn.microsoft.com/zh-cn/library/system.windows.media.mediaplayer.aspx,因为它不是一个控件,本身不具备可视界面,必须用 VideoDrawing 或 DrawingContext 来绘制到 Brush 上,此外它对媒体内容的操作方法和 MediaElement 控件完全相同,所以我猜测它可能不是 Host 的 ActiveX,请确认一下。

    同时经过测试,目前WMP12能播放rmvb,但 MediaPlayer 和 MediaElement 一样都不行。

    谢谢继续关注。

    我在填写这条回复时发现一个怪事,按下回车换行后会自动回退撤销换行,只有按住不放多次换行后删除多余的才行。浏览器为64位IE9

    2011年6月16日 9:23
  • Well, 那么还是MediaElement其实。对于rmvb 还是不建议使用WMP相关的组件,本身rmvb格式属于私有规范,Windows Media Player就没有很好的支持, 他的相关ActiveX就根本不能支持。 所以你方不了rmvb。

     

    看这位大哥写得例子吧,http://www.cnblogs.com/gnielee/archive/2010/05/06/wpf4-media-player-mediaelement.html 简单的用WPF做个播放器,放放 WMV AVI什么没什么问题。

     

    PS: 那个回车的问题,我在论坛这么久,也是最近发现, 没办法属于论坛编辑器的问题,好像是HTML自动格式的问题,有时候你从别的地方复制内容过来,就会发生,这个时候只能把你当前的内容复制到写字板,清空然后再粘贴回来。

    我们做论坛支持基本上都是在文本编辑器中写好一次性复制过来的,以防写了一半,内容被刷新掉。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月17日 6:21
    版主
  • 我看了这几个链接,两个 MediaElement 的例子都是它的基本应用,目前我已实现的功能比他们的多,并且他们的代码在改变进度的时候会遇到同样的问题。目前正在尝试理解第二个链接,不知能否提供对 WMV 格式能够解决开始的第一或第三个问题的例子?
    2011年6月18日 15:40
  • 我以前做测试都是用的WMV, 是可以做到你要的要求的。

    你看这个例子吧: http://www.codeproject.com/KB/WPF/WPF_Media_Player.aspx


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月22日 2:50
    版主