c#录音功能怎么实现
答案:2 悬赏:60 手机版
解决时间 2021-01-02 23:19
- 提问者网友:趣果有间
- 2021-01-02 09:14
c#录音功能怎么实现
最佳答案
- 五星知识达人网友:从此江山别
- 2021-01-02 10:52
class RecordingAudio
{
static int sum = 0;
static Timer timer;
///
/// 获取当前是否是正在录制状态
///
public static bool IsRecordingAudio { get; private set; }
[DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
public static extern int mciSendString(
string lpstrCommand,
string lpstrReturnString,
int uReturnLength,
int hwndCallback
);
///
/// 开始录制
///
public static void Start()
{
mciSendString("set wave bitpersample 16", "", 0, 0);
mciSendString("set wave samplespersec 22050", "", 0, 0);
mciSendString("set wave channels 1", "", 0, 0);
mciSendString("set wave format tag pcm", "", 0, 0);
mciSendString("open new type WAVEAudio alias movie", "", 0, 0);
mciSendString("record movie", "", 0, 0);
timer = new Timer(200);
timer.Elapsed += timer_Tick;
sum = 0;
timer.Enabled = true;
IsRecordingAudio = true;
}
private static void timer_Tick(object sender, ElapsedEventArgs e)
{
sum++;
}
///
/// 停止录制,返回录制时间(进1原则)
///
///
public static int Stop()
{
FileUtils.CheckAndCreateFolder();
mciSendString("stop movie", "", 0, 0);
mciSendString("save movie " + "resource/" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".wav", "", 0, 0);
mciSendString("close movie", "", 0, 0);
IsRecordingAudio = false;
timer.Enabled = false;
timer.Dispose();
int s = sum * 200;
return s % 1000 == 0 ? s / 1000 : s / 1000 + 1;///进1原则
}
}
{
static int sum = 0;
static Timer timer;
///
/// 获取当前是否是正在录制状态
///
public static bool IsRecordingAudio { get; private set; }
[DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
public static extern int mciSendString(
string lpstrCommand,
string lpstrReturnString,
int uReturnLength,
int hwndCallback
);
///
/// 开始录制
///
public static void Start()
{
mciSendString("set wave bitpersample 16", "", 0, 0);
mciSendString("set wave samplespersec 22050", "", 0, 0);
mciSendString("set wave channels 1", "", 0, 0);
mciSendString("set wave format tag pcm", "", 0, 0);
mciSendString("open new type WAVEAudio alias movie", "", 0, 0);
mciSendString("record movie", "", 0, 0);
timer = new Timer(200);
timer.Elapsed += timer_Tick;
sum = 0;
timer.Enabled = true;
IsRecordingAudio = true;
}
private static void timer_Tick(object sender, ElapsedEventArgs e)
{
sum++;
}
///
/// 停止录制,返回录制时间(进1原则)
///
///
public static int Stop()
{
FileUtils.CheckAndCreateFolder();
mciSendString("stop movie", "", 0, 0);
mciSendString("save movie " + "resource/" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".wav", "", 0, 0);
mciSendString("close movie", "", 0, 0);
IsRecordingAudio = false;
timer.Enabled = false;
timer.Dispose();
int s = sum * 200;
return s % 1000 == 0 ? s / 1000 : s / 1000 + 1;///进1原则
}
}
全部回答
- 1楼网友:低音帝王
- 2021-01-02 11:23
c#中使用directsound录音 一.声卡录音的基本原理 为了实现一个录音的基本过程,至少需要以下对象的支持: 1. 录音设备,对我们的pc设备就是声卡。这个录音设备可以进行的操作应该有开始和关闭。 2. 缓冲区,也就是录制的声音放在哪里的问题。 二.directsound对录音的描述模型 1. directsound对录音的支持类 Ø capture,设备对象,可以看作是声卡的描述。 Ø capturebuffer,缓冲区对象,存放录入的音频数据。 Ø notify,事件通知对象,由于录音是一个长时间的过程,因此使用一个缓冲队列(多个缓冲区)接收数据,每当一个缓冲区满的时候,系统使用这个对象通知应用程序取走这个缓冲区,并继续录音。 以上三个对象是进行录音操作的主要对象,由于在c++中对directsound的操作directx帮助文档中已经有很详细的说明,这里就不再赘述了。本文是针对managed code。除了以上三个主要的directsound类,还需要以下几个辅助类。 Ø waveformat,描述了进行录制的声音波形的格式,例如采样率,单声道还是立体声,每个采样点的长度等等。 Ø thread,线程类,由于录音的过程是需要不断处理缓冲区满的事件,因此新建一个线程对此进行单独处理。 Ø autoresetevent,通知的事件,当缓冲区满的时候,使用该事件作为通知事件。 三.代码解析(soundrecord类) 1.需要引用的程序集 using system; using system.windows.forms; using system.threading; using system.io; // 对directsound的支持 using microsoft.directx; using microsoft.directx.directsound; 2. soundrecord的成员数据 public const int cnotifynum = 16; // 缓冲队列的数目 private int mnextcaptureoffset = 0; // 该次录音缓冲区的起始点 private int msamplecount = 0; // 录制的样本数目 private int mnotifysize = 0; // 每次通知大小 private int mbuffersize = 0; // 缓冲队列大小 private string mfilename = string.empty; // 文件名 private filestream mwavefile = null; // 文件流 private binarywriter mwriter = null; // 写文件 private capture mcapdev = null; // 音频捕捉设备 private capturebuffer mrecbuffer = null; // 缓冲区对象 private notify mnotify = null; // 消息通知对象 private waveformat mwavformat; // 录音的格式 private thread mnotifythread = null; // 处理缓冲区消息的线程 private autoresetevent mnotificationevent = null; // 通知事件 3. 对外操作的函数 /// /// 构造函数,设定录音设备,设定录音格式. /// </summary&
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯