我想创建一个wavefile,并向其写入数据,我希望文件名是它开始的时间。
我知道使用Wavewriter写入波形文件很热,我知道如何将其命名为当前时间,但问题是,使文件尽可能接近文件的名称。
目前我有这样的事情:
private void SaveReceivedAudio(string recieve)
{
try
{
using (var folderBrowser = new FolderBrowserDialog())
{
DialogResult result = folderBrowser.ShowDialog();
if (result == DialogResult.OK)
{
path = Path.GetFullPath(folderBrowser.SelectedPath) + (Path.DirectorySeparatorChar);
waveWriter = new NAudio.Wave.WaveFileWriter(path + recieve + "- " + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff") + ".wav", new WaveFormat(48000, 16, 2));
waveWriterYour = new WaveFileWriter(path + Environment.UserName + " - " + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff") + ".wav", new WaveFormat(48000, 16, 2));
Record = true;
Recording.ForeColor = System.Drawing.Color.Green;
Recording.Text = "Recording";
}
else
{
Record = false;
Recording.ForeColor = System.Drawing.Color.Red;
Recording.Text = "Not Recording";
}
}
}
catch (Exception e)
{
MessageBox.Show("SaveReceivedAudio: " + e.Message);
}
}
因为你可以看到我点击一个按钮,选择一个目录,然后它会在创建时创建2个文件,然后将Record更改为True。
然而,这根本不准确,它可能相当接近,但这一切都取决于它是如何执行的。
现在,当我保存另一个线程时,当前音频数据处于循环状态,如下所示:
private void RecordingQueueThread()
{
byte[] AudioData;
byte[] AudioData2;
while (connect)
{
try
{
if (Queue.TryTake(out AudioData, 300))
{
if (AudioData.Length == 0)
break;
else
{
if (Record)
{
waveWriter.Write(AudioData, 0, AudioData.Length);
waveWriter.Flush();
TestTimer += AudioData.Length;
}
}
}
if (RecQueue.TryTake(out AudioData2, 300))
{
if (AudioData.Length == 0)
break;
else
{
if (Record)
{
waveWriterYour.Write(AudioData, 0, AudioData.Length);
waveWriterYour.Flush();
}
}
}
}
catch (Exception e)
{
MessageBox.Show("Recording: " + e.Message);
}
}
}
或者,好吧,也许不是在一个循环中,但有2个线程为此提供。
但正如你所看到的,因为有2个线程(或更多)独立工作,音频将不会出现在我之前写的日期时,它会稍晚一些,它可能会有所不同,具体取决于好吧,很多事情,处理时间等。
这使这成为一个问题。
最好的事情是,如果我可以在第一次写入数据时准确写出时间,我不知道该怎么做。
有什么想法吗?