用.net开发音频编辑软件
作者:互联网
智能语音机器人软件免不了需要对语音流进行处理,主要包括语音的播放、录制、读取、保存、图形化展示和剪辑等功能。这方面专业的软件有Adobe Audition,为了方便用户使用,我用.net实现了上述功能。
由于这些功能相对比较独立,我顺便做了一个工具软件,如下图所示。
本软件适用的音频文件格式是wav、单声道、8000采样率、16比特。
在这里介绍一下开发这个软件过程几个有意思的点:
一、音频分段表示
将音频文件的数据部分用List<byte[]>进行分段。
FrameData = new List<byte[]>();
byte[] buffer = new byte[320];
int readedCount = 0;
i = 0;
readedCount = fileStream.Read(buffer, 0, buffer.Length);
while (readedCount > 0)
{
++i;
FrameData.Add(buffer);
buffer = new byte[320];
readedCount = fileStream.Read(buffer, 0, buffer.Length);
}
当播放音频文件时,根据传输速率每20毫秒向SecondaryBuffer写入320 byte的数据进行播放,并记录播放位置(FramePlayPositon),当暂时退出循环。当下次继续播放时,从FramePlayPositon开始继续播放。
for (int i = FramePlayPositon; i < AudioFile.Data.FrameNumber; ++i)
{
if (IsSuspend)
{
break;
}
ControlPlayPositon = GetControlPosition(i);
VoicePlayer.Instance.Play(AudioFile.Data.FrameData[i]);
FramePlayPositon = i;
Thread.Sleep(19);
}
二、显示播放指针
为了显示播放进度,用一条红色的竖线表示播放指针,在控件的ControlPlayPositon这个点上绘制。
在播放过程中为了同步显示自左向右移动的播放指针,需要不停地重绘控件图形,并按新的ControlPlayPositon绘制红色竖线。
using (Bitmap canvasDrawedCopy = DeepClone(_CanvasDrawed))
{
Graphics cursorGraphic = Graphics.FromImage(canvasDrawedCopy);
Pen pen = new Pen(Color.FromArgb(191, 0, 0), 2);
cursorGraphic.DrawLine(pen, ControlPlayPositon, 0, ControlPlayPositon, Bound.Height);
using (Graphics gc = CreateGraphics())
{
gc.DrawImage(canvasDrawedCopy, 0, 0);
}
canvasDrawedCopy.Dispose();
}
三、音频数据的复制、剪切、粘贴
在控件中通过拖动鼠标选中某一块音频内容后,可以通过Ctrl+C进行复制,Ctrl+X进行复制剪切,然后在控件中点击需要插入的位置,按Ctrl+V实现粘贴。
在音频数据分段表示的基础上,就可以方便地实现这复制、剪切、粘贴功能了。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (AllowEdit)
{
if (keyData == (Keys.Control | Keys.C))
{
List<byte[]> frameData = GetSelectedFrameData();
Clipboard.SetDataObject(frameData);
}
else if (keyData == (Keys.Control | Keys.X))
{
List<byte[]> frameData = GetSelectedFrameData();
Clipboard.SetDataObject(frameData);
DeleteSelected();
}
else if (keyData == (Keys.Control | Keys.V))
{
IDataObject data = Clipboard.GetDataObject();
List<byte[]> frameData = data.GetData(typeof(List<byte[]>)) as List<byte[]>;
if (frameData != null && frameData.Count > 0)
{
if (AudioFile != null)
{
AudioStream audioStream = new AudioStream();
audioStream.CreateWaveFormat(8000);
int start = GetFramePosition(MouseStartPoint.X);
for (int i = 0; i <= start; ++i)
{
audioStream.AppendWhole(AudioFile.Data.FrameData[i]);
}
for (int i = 0; i < frameData.Count; ++i)
{
audioStream.AppendWhole(frameData[i]);
}
for (int i = start + 1; i < AudioFile.Data.FrameNumber; ++i)
{
audioStream.AppendWhole(AudioFile.Data.FrameData[i]);
}
string fileName = TempPath + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".wav";
audioStream.SaveWholeStream(fileName);
FileName = fileName;
ReFlash();
}
}
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
对这个工具软件感兴趣的朋友可以通过下面这个链接下载,欢迎交流、指正。
http://Resource.HzBaiLing.cn/upload/VoiceRecord.rar
标签:frameData,Keys,List,buffer,软件,net,播放,AudioFile,音频编辑 来源: https://www.cnblogs.com/JiKang/p/10630400.html