前提:最近要求做一个在winform端做一个音频文件播放的功能,至此,总结最近搜寻的相关资料。

一、微软提供了三种方式来播放音频文件

1、通过System.Media.SoundPlayer来播放

2、通过Com组件,添加axWindowsMediaPlayer控件播放。

3、通过ApI函数mcisendstring播放

————————————————————————————————————————分割线——————————————————————————————————————————

二:使用

1、通过System.Media.SoundPlayer

首先,在Com类型库中添加Windows Media Player组件的引用

添加的引用之后,就可以直接使用了

代码如下:

private void button2_Click(object sender, EventArgs e)
{
       string path=@"D:/test.wav";
System.Media.SoundPlayer player = new System.Media.SoundPlayer();
player.SoundLocation = path;
player.LoadAsync();
player.PlaySync();
}

注意,这种方式,只支持波形文件的播放,波形文件主要包括wav格式的文件,其余的格式文件都不支持。

2、通过Com组件,添加axWindowsMediaPlayer控件播放。

首先,需要在工具箱中添加Com组件,具体步骤,找到工具箱,在工具箱的空白位置,右键,选择“选择项”,点击“Com”组件,选择 Windows Media Player,如果所示

选择之后,在工具箱中就会显示Windows Media Player,如图所示

将“Windows Media Player”控件拖到Form表单中,就显示了Windows Media Player播放器,如图所示

添加代码如下:

private void button1_Click(object sender, EventArgs e)
{
  axWindowsMediaPlayer1.URL = @"D:/Test.mp3";
axWindowsMediaPlayer1.settings.autoStart = true;
}

注意:这种方式支持的文件格式比较多,主要包括:mp3、wav、mp4,wmv格式。

url参数可以直接访问服务器端的文件,前缀要添加http://;例如 string path="http://192.168.168.12:6666/JTERPAduio/Test.mp3";

3、通过ApI函数mcisendstring播放

封装Play类

using System;

using System.Runtime.InteropServices;

using System.Text;

using System.IO;

using System.Windows.Forms;

namespace WindowsFormsApplication1
{
class AudioPlay
{ // // TODO: 在此处添加构造函数逻辑 // //定义API函数使用的字符串变量 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] private string Name = ""; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] private string durLength = ""; [MarshalAs(UnmanagedType.LPTStr, SizeConst = 128)] private string TemStr = ""; int ilong; //定义播放状态枚举变量 public enum State
{ mPlaying = 1, mPuase = 2, mStop = 3 }; //结构变量 public struct structMCI
{ public bool bMut; public int iDur; public int iPos; public int iVol; public int iBal; public string iName; public State state; }; public structMCI mc = new structMCI(); //取得播放文件属性 public string FileName
{ get
{ return mc.iName; } set
{ //ASCIIEncoding asc = new ASCIIEncoding(); try
{ TemStr = ""; TemStr = TemStr.PadLeft(127, Convert.ToChar(" ")); Name = Name.PadLeft(260, Convert.ToChar(" ")); mc.iName = value; ilong = APIClass.GetShortPathName(mc.iName, Name, Name.Length); Name = GetCurrPath(Name); //Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media"; Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media"; ilong = APIClass.mciSendString("close all", TemStr, TemStr.Length, 0); ilong = APIClass.mciSendString(Name, TemStr, TemStr.Length, 0); ilong = APIClass.mciSendString("set media time format milliseconds", TemStr, TemStr.Length, 0); mc.state = State.mStop; } catch
{ } } } //播放 public void play()
{ TemStr = ""; TemStr = TemStr.PadLeft(127, Convert.ToChar(" ")); APIClass.mciSendString("play media", TemStr, TemStr.Length, 0); mc.state = State.mPlaying; } //停止 public void StopT()
{ TemStr = ""; TemStr = TemStr.PadLeft(128, Convert.ToChar(" ")); ilong = APIClass.mciSendString("close media", TemStr, 128, 0); ilong = APIClass.mciSendString("close all", TemStr, 128, 0); mc.state = State.mStop; } public void Puase()
{ TemStr = ""; TemStr = TemStr.PadLeft(128, Convert.ToChar(" ")); ilong = APIClass.mciSendString("pause media", TemStr, TemStr.Length, 0); mc.state = State.mPuase; } private string GetCurrPath(string name)
{ if (name.Length < 1) return ""; name = name.Trim(); name = name.Substring(0, name.Length - 1); return name; } //总时间 public int Duration
{ get
{ durLength = ""; durLength = durLength.PadLeft(128, Convert.ToChar(" ")); APIClass.mciSendString("status media length", durLength, durLength.Length, 0); durLength = durLength.Trim(); if (durLength == "") return 0; return (int)(Convert.ToDouble(durLength) / 1000f); } }
//当前时间
public int CurrentPosition
{ get
{ durLength = ""; durLength = durLength.PadLeft(128, Convert.ToChar(" ")); APIClass.mciSendString("status media position", durLength, durLength.Length, 0); mc.iPos = (int)(Convert.ToDouble(durLength) / 1000f); return mc.iPos;
}
}
}
public class APIClass
{ [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public static extern int GetShortPathName( string lpszLongPath, string shortFile, int cchBuffer ); [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)] public static extern int mciSendString( string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback ); } }

调用也非常简单:

   private void button3_Click(object sender, EventArgs e)
{
AudioPlayer cm = new AudioPlayer ();
cm.FileName =@"D:/mp3222.mp3";
cm.play();
}

注意:

1、这种方式支持mp3格式,其余的格式没有测试。

2、在AudioPlayer类中,通过APIClass.GetShortPathName(mc.iName, Name, Name.Length)方法根据长路径获得短路径,但这种方法不能获得服务器的短路径,所以,目前不知道根据这种方法播放服务器端的文件。但是可以通过将服务器端的文件加载的本地,在通知这种方式来播放本地文件。

总结:这三种方法都没法实现amr文件的播放,可以通过第三方插件(libvlc播放器是个不错的选择)的方式实现,但没有深入研究过,有大神也可以知道下,至今播放amr文件没有很好的解决方案。因为手机上传过来的文件,大多是amr文件。

  

.NET winform播放音频文件的更多相关文章

  1. 关于Window Server2008 服务器上无法播放音频文件的解决方案

    在偌大的百度当中查找我所需要的资源信息,但网络上所描述的都不能解决,发生此类问题的人很多,但是都没有得到准确的解决方法!经个人各方面的尝试,其实非常简单的解决了无法播放音频文件的问题,如果各位今后也遇 ...

  2. ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件

    原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class= ...

  3. C#调用mciSendString播放音频文件

    mciSendString函数是一个WinAPI,主要用来向MCI(Media Control Interface)设备发送字符串命令. 一.函数的声明如下: private static exter ...

  4. Unity 播放音频文件

    Unity 播放音频文件参考代码: public void Play(string strSoundName, float autoDestroyTime = 0f, bool bLoop = fal ...

  5. Qt 播放音频文件

    Qt播放音频文件的方法有好多中,简单介绍几种 不过一下几种方式都需要在Qt工程文件中添加 QT       += multimedia 第一 QMediaPlayer类 可以播放MP3文件,同时使用也 ...

  6. h5 audio播放音频文件

    h5 audio播放音频文件 注:下面html中样式及不相关的内容去掉了 第一个例子 播放没有防盗链的外网音频文件是可以的 <!doctype html> <html> < ...

  7. jquery自动播放音频文件

    使用jquery自动播放音频文件 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. 使用audio标签播放音频文件

    HTML5定义了一个新的元素用来指定标准的方式来插入音频文件到web页面中:<audio>标签.使用audio标签可以控制音频的播放与停止,循环播放与播放次数设置,以及播放位置等等. 例如 ...

  9. linux dsp 播放音频文件

    #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/ioc ...

随机推荐

  1. msvcp140.dll丢失解决方案

    [首先给出99%情况下都能解决这个问题的最简单办法]:   下载并安装微软VC++2015版运行库 (英文全称:Microsoft Visual C++ 2015 Redistributable Pa ...

  2. 安装zookeeper遇到的问题

    最近在安装zookeeper的时候遇到了一个问题:调用./zkServer.sh start之后,使用命令telnet localhost 2181,显示访问被拒绝.然后使用netstat查看监听21 ...

  3. mmap映射区和shm共享内存的区别总结

    [转载]原文链接:https://blog.csdn.net/hj605635529/article/details/73163513 linux中的两种共享内存.一种是我们的IPC通信System ...

  4. Vue 折叠面板Collapse在标题上添加组件后,阻止面板冒泡的用法

    iView组件中,折叠面板Collapse点击面板标题部分,会出现面板收起或展开的效果.那么在面板标题后面再添加下拉框之类的组件时,会出现跟面板点击一样的效果,这时候就需要阻止冒泡的用法了.具体代码: ...

  5. java 中文繁简体转换工具 opencc4j

    创作缘由 对于中文的繁简体转换是一种很常见的需求. 但是很多工具类都是简单的做个映射.(使用map,集合,properties)等. 存在一个严重的问题:特殊词组 的转换可能存在问题. OpenCC ...

  6. 使用fdisk进行分区

    fdisk进行分区 1.首先使用fdisk -l 发现待分区磁盘/dev/vdb  大小为1TB 2.fdisk /dev/vdb 对该磁盘进行分区,输入m并回车 3.输入n并回车,n是“new”新建 ...

  7. python常用库,包网址

    常用包下载:https://pypi.org/ 1.NumPy: https://www.numpy.org/ 2.pandas: http://pandas.pydata.org/ 3.SciPy: ...

  8. SQL Server截取字符串

    --SQL Server截取字符串 , Len('hello@163.com')) ,charindex('.','hello@163.com'))

  9. xml实现登录表单验证

    定义: XML(eXtended Markup Language,可扩展标记语言)提供了一套跨平台.跨网络.跨程序的语言的数据描述方式,使用XML可以方便地实现数据交换.系统配置.内容管理等常见功能. ...

  10. Ubuntu下解决MySQL自启动,chkconfig list 全部off 情况

    chkconfig命令是用于RedHat/Fedora发行版的,而对于像Ubuntu之类的Debian发行版,应该使用这个命令: sudo update-rc.d mysql defaults 验证一 ...