[Winform]Media Player com组件应用中遇到的问题

时间:2022-02-05 09:45:45

最近一个项目中,需要用到在客户端全屏循环播放视频,当时考虑使用开源的播放器,,但控制起来不方便,然后考虑既然都是windows系统,那么可以考虑使用微软自带的Media Player播放器。所以在开发中,就在winform中嵌入了Media Player组件。下面就将开发中遇到的问题,做一个总结。

问题与解决办法

首先要搞清楚Media Player到底是x86的还是x86的。我电脑系统是x64的,可以尝试打开Media Player,在任务管理器中查看是不是x64的。

[Winform]Media Player com组件应用中遇到的问题

所以media player 是x86还是x86的。在开发中,最好以Any CPU 或者x86的方式运行或者生产项目,不然有可能出现渲染com组件失败的情况。这个项目因为引入了cefSharp组件,需要指定运行平台,我这里设置为x86。

如果在添加com组件的时候报错,可以尝试关闭vs,将包含vshost的文件删除,然后重启vs,重新生成尝试。

如图所示

[Winform]Media Player com组件应用中遇到的问题

这样算是设置正常了,然后我们可以对它的属性进行设置,在播放器上面右键属性,如图所示

[Winform]Media Player com组件应用中遇到的问题

选择模式,可以对播放器下面的播放控制按钮进行设置,是全显示,还是不显示,这个项目中是作为屏保的,所以这里让其隐藏,所以设置为None,全屏设置为true。

关于全屏设置,也可以通过代码进行控制,可以参考这篇文章:

[Winform]Media Player组件全屏播放的设置

这里可以通过属性进行设置,比较方便,最好还是通过属性来设置。一是方便,二是让控制全屏的逻辑交给组件来进行。

勾选按比例拉伸,可以让视频平铺。并且设置播放器的属性Dock=Fill。

this.windowsMediaPlay.Dock = System.Windows.Forms.DockStyle.Fill;

让其填充窗口。

在项目中,因为设置的是x64的方式运行,以及没有设置填充的方式。导致播放视频出现白边的bug。

循环播放的设置

windowsMediaPlay.settings.setMode("loop", true);

在初始化完成Media Player时,最好加上初始化结束的标记

windowsMediaPlay.EndInit();

添加播放列表,默认播放目录,如果包含mp4,wmv文件,加入播放列表

windowsMediaPlay.settings.setMode("loop", true); string[] filePaths = Directory.GetFiles(_videoDirPath).Where(x => x.EndsWith(".mp4") || x.EndsWith(".wmv")).ToArray(); //清空播放列表 windowsMediaPlay.currentPlaylist.clear(); //添加循环播放列表 foreach (var item in filePaths) { windowsMediaPlay.currentPlaylist.appendItem(windowsMediaPlay.newMedia(item)); }

播放

windowsMediaPlay.Ctlcontrols.play();

停止

windowsMediaPlay.Ctlcontrols.stop();

暂停

windowsMediaPlay.Ctlcontrols.pause();

属性介绍

enableContextMenu:Boolean 显示/不显示播放位置的右键菜单
fullScreen:boolean 全屏显示
stretchToFit:boolean 非全屏状态时是否伸展到最佳大小
uMode:string 播放器的模式,full:有下面的控制条; none:只有播放部份没有控制条
playState:integer 当前控件状态,下面是三种基本状态:
3:正在播放
2:暂停
1:已停止
状态变化时会触发OnStatusChange事件
[controls]
可通过WindowsMediaPlayer.controls对播放器进行控制并取得相关的一些信息:
controls.play; 播放
controls.stop; 停止
controls.pause; 暂停
controls.currentPosition:Double 当前播放进度
controls.currentPositionString:string 时间格式的字符串 "0:32"
[currentMedia]
可以通过WindowsMediaPlayer.currentMedia取得当前媒体的信息
currentMedia.duration Double 总长度
currentMedia.durationString 时间格式的字符串 "4:34"
[settings]
可以通过WindowsMediaPlayer.settings对播放器进行设置,包括音量和声道等。
settings.volume:integer 音量 (0-100)
settings.balance:integer 声道,通过它应该可以进行立体声、左声道、右声道的控制。
=================
版本2:
属性/方法名: 说明:
[基本属性]  
url:string指定媒体位置,本机或网络地址
uiMode:String; 播放器界面模式,可为Full, Mini, None, Invisible
playState:integer; 播放状态,1=停止,2=暂停,3=播放,6=正在缓冲,9=正在连接,10=准备就绪
enableContextMenu:Boolean; 启用/禁用右键菜单
fullScreen:boolean; 是否全屏显示
[controls] wmp.controls //播放器基本控制
controls.play; 播放
controls.pause; 暂停
controls.stop; 停止
controls.currentPosition:double; 当前进度
controls.currentPositionString:string; 当前进度,字符串格式。如“00:23”
controls.fastForward; 快进
controls.fastReverse; 快退
controls.next; 下一曲
controls.previous; 上一曲
[settings] wmp.settings //播放器基本设置
settings.volume:integer; 音量,0-100
settings.autoStart:Boolean; 是否自动播放
settings.mute:Boolean; 是否静音
settings.playCount:integer; 播放次数
[currentMedia] wmp.currentMedia //当前媒体属性
currentMedia.duration:double; 媒体总长度
currentMedia.durationString:string; 媒体总长度,字符串格式。如“03:24”
currentMedia.getItemInfo(const string); 获取当前媒体信息"Title"=媒体标题,"Author"=艺术家,"Copyright"=版权信息,"Description"=媒体内容描述,"Duration"=持续时间(秒),"FileSize"=文件大小,"FileType"=文件类型,"sourceURL"=原始地址
currentMedia.setItemInfo(const string); 通过属性名设置媒体信息
currentMedia.name:string; 同 currentMedia.getItemInfo("Title")
[currentPlaylist] wmp.currentPlaylist //当前播放列表属性
currentPlaylist.count:integer; 当前播放列表所包含媒体数
currentPlaylist.Item[integer]; 获取或设置指定项目媒体信息,其子属性同wmp.currentMedia

Media Player事件属性可参考MSDN

https://msdn.microsoft.com/en-us/library/windows/desktop/dd562419(v=vs.85).aspx

[Winform]Media Player com组件应用中遇到的问题