在开发C#Winform应用程序时,经常需要在界面中嵌入媒体播放功能。传统的方法是使用Windows Media Player组件,但这种方法往往需要处理复杂的COM/ActiveX控件。本文将介绍一种更简洁的方法:使用Mplayer命令行工具来播放媒体文件。
需要在C#Winform应用程序中显示视频,但不想使用MediaPlayer组件。Mplayer是一个命令行电影播放器,它可以使用多种不同的输出驱动器显示视频输出。它看起来是一个合适的选择,但是没有找到如何在C# winform应用程序中使用mplayer显示输出的示例,也没有找到使用.NET框架制作的mplayer前端。
通过查看找到的C++示例,发现在C#中实现这一点也相当简单。本文将展示如何使用Mplayer轻松在应用程序中显示视频文件。
本项目主要使用以下技术:
在窗体类中声明了以下变量:
string args = "";
string filename = null;
Process ps = null;
其中,args将持有传递给进程的参数(除了文件名)。filename将是被选择打开的文件的名称。ps是进程对象。将使用它来保持对mplayer进程的引用。
将使用System.Diagnostics命名空间中的Process类来启动mplayer的一个实例来播放视频文件。将重定向输入,以便可以通过设置向mplayer进程发送命令。以下是用来初始化进程的代码:
ps = new Process();
ps.StartInfo.FileName = "mplayer.exe";
ps.StartInfo.UseShellExecute = false;
ps.StartInfo.RedirectStandardInput = true;
args = "-nofs -noquiet -identify -slave -nomouseinput -sub-fuzziness 1 -vo direct3d, -ao dsound -wid ";
int id = (int)panel1.Handle;
args += id;
使用-slave选项,因为希望以'slave'模式运行mplayer,它将从另一个进程读取命令并相应地执行操作。-nofs选项将告诉mplayer不要以全屏模式运行。-wid选项将告诉窗口ID,希望在哪个窗口中显示视频输出。在这里,希望在panel1中显示,所以获取它的句柄并传递给-wid。
当用户点击选择文件时,将打开一个文件打开对话框,选择文件后,其路径将存储在filename变量中。OpenFile函数用于播放文件。代码如下:
void OpenFile()
{
if (filename == null)
return;
try
{
ps.Kill();
}
catch
{
}
try
{
ps.StartInfo.Arguments = args + "\"" + filename + "\"";
ps.Start();
SendCommand("set_property volume " + trkVolume.Value);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
首先确保启动的任何先前的mplayer实例都已关闭。然后将选定文件的路径附加到将传递给mplayer的参数中。将调用进程对象的start方法来开始播放电影。
SendCommand函数将执行向mplayer进程发送命令的任务。代码如下:
bool SendCommand(string cmd)
{
try
{
if (ps != null && !ps.HasExited)
{
ps.StandardInput.Write(cmd + "\n");
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}
通过这种方式,可以传递命令并控制正在播放的电影。现在要播放或暂停选定的电影,可以使用以下代码:
if (SendCommand("pause") == false)
{
OpenFile();
}
"pause"命令将暂停当前正在播放的电影或恢复暂停的电影。如果电影已经播放完毕,mplayer进程将不再运行。所以SendCommand将返回false。在这种情况下,将调用OpenFile函数,它将重新启动进程并开始播放选定的电影文件。
如果暂停了电影,但由于某些原因应用程序崩溃了,可能会有一个mplayer进程无用地运行。通过将项目的输出类型更改为控制台并设置UseShellExecute=false,将拥有一个控制台,如果mplayer没有终止,关闭控制台也将关闭mplayer。
在这个示例中,只是向mplayer进程发送数据,没有读取任何内容。也可以重定向进程的输出,以读取有关当前播放文件的信息,如位置或持续时间。如果认为在演示应用程序中包含一个搜索栏来演示这一点是个好主意,请告诉。