前提:最近要求做一个在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. json 数据在textarea中显示的时候,切换 beauty和ugly模式

    转化为beauty模式 var jsonText = $('#json').val(); $('#json').val(JSON.stringify(JSON.parse(jsonText), nul ...

  2. CentOS 7安装WordPress

    在开始本文前,我假定你已经安装好了nginx.php-fpm和mariaDB(或mysql).它们的安装过程可参考我以前的文章. 1. 安装EPEL(Extra Packages for Enterp ...

  3. Windows程序设计_21_Win32文件操作

    没什么新的内容,自己的练习代码,供大家点评. /* Windows系统编程--实例 1)复制文件 */ #define UNICODE //#define _UNICODE #include < ...

  4. Mysql建了索引查询很慢

    遇到一个问题,有几个结构一个的查询,表的索引建的也一样,但是有的查询很快,有的却很慢,需要半分钟以上才能执行完. 查看执行计划,并没有什么区别.找了很久原因才发现是主查询和子查询所涉及的表的字符编码不 ...

  5. centos7 源码安装redis

    安装3.x [root@node1 ~]# yum install wget gcc-c++ make [root@node1 ~]# wget http://download.redis.io/re ...

  6. 20175311 2018-2019-2 《Java程序设计》第1周学习总结

    教材学习内容总结 第一周我们主要尝试了怎么安装各种以后可能需要用到的软件,根据老师提供的博客教程进行自主学习安装软件,然后编写一些简单的语言程序. 教材学习中的问题和解决过程 问题1:在学习过程中主要 ...

  7. linux服务nfs与dhcp篇

    nfs复习: 1.简介:用于liunx与linux之间的文件传输系统 2.下载nfs-utils和rpcbind 3.打开配置文件/etc/exports——文件名(目录名)共享给予的ip地址(rw) ...

  8. kubernetes学习笔记之十二:资源指标API及自定义指标API

    第一章.前言 以前是用heapster来收集资源指标才能看,现在heapster要废弃了从1.8以后引入了资源api指标监视 资源指标:metrics-server(核心指标) 自定义指标:prome ...

  9. python-web微信实现

    1.url from django.conf.urls import url from django.contrib import admin from web import views urlpat ...

  10. Python直接改变实例化对象的列表属性的值 导致在flask中接口多次请求报错

    错误原理实例如下: class One(): list = [1, 2, 3] @classmethod def get_copy_list(cls): # copy一份list,这样对list的改变 ...