如何在.NET中将提示/标记写入WAV文件

时间:2009-10-11 14:30:15

标签: c# .net audio wav

我想用C#向一个WAV文件写入提示(即基于时间的标记,而不是类似ID3的标记)。似乎免费的.NET音频库如NAudio和Bass.NET不支持这一点。

我找到了Cue Tools的来源,但它完全没有记录,而且相对复杂。任何替代方案?

1 个答案:

答案 0 :(得分:3)

这是一个解释WAV文件中cue块的格式的链接:

http://www.sonicspot.com/guide/wavefiles.html#cue

因为WAV文件使用RIFF格式,所以您只需将cue块附加到现有WAV文件的末尾即可。要在.Net中执行此操作,您可以使用带有路径和System.IO.FileStream的构造函数打开FileMode对象(为此,您可以使用FileMode.Append)。然后,您将从BinaryWriter创建FileStream,并使用它来编写cue chunk本身。

这是一个粗略的代码示例,用于将带有单个提示点的cue块附加到WAV文件的末尾:

System.IO.FileStream fs = 
    new System.IO.FileStream(@"c:\sample.wav", 
    System.IO.FileMode.Append);
System.IO.BinaryWriter bw = new System.IO.BinaryWriter(fs);
char[] cue = new char[] { 'c', 'u', 'e', ' ' };
bw.Write(cue, 0, 4); // "cue "
bw.Write((int)28); // chunk size = 4 + (24 * # of cues)
bw.Write((int)1); // # of cues
// first cue point
bw.Write((int)0); // unique ID of first cue
bw.Write((int)0); // position
char[] data = new char[] { 'd', 'a', 't', 'a' };
bw.Write(data, 0, 4); // RIFF ID = "data"
bw.Write((int)0); // chunk start
bw.Write((int)0); // block start
bw.Write((int)500); // sample offset - in a mono, 16-bits-per-sample WAV
// file, this would be the 250th sample from the start of the block
bw.Close();
fs.Dispose();

注意:我从未使用或测试过此代码,所以我不确定它是否正常工作。它只是为了让您大致了解如何在C#中编写它。