2

我正在用 C# 编写一个应用程序,它将记录音频文件 (*.wav) 并自动标记和命名它们。波形文件是 RIFF 文件(如 AVI),除了波形数据块外,它还可以包含元数据块。所以现在我试图弄清楚如何从录制的波形文件中读取和写入 RIFF 元数据。

我正在使用 NAudio 来记录文件,并在他们的论坛上以及SO 上询问读取和写入 RIFF 标签的方式。虽然我收到了许多好的答案,但没有一个解决方案可以像我想要的那样轻松地读取和写入 RIFF 块。

但更重要的是,我在处理字节级别的文件方面经验很少,并且认为这可能是一个学习的好机会。所以现在我想尝试编写自己的类,它可以读取 RIFF 文件并允许从文件读取和写入元数据。

我在 C# 中使用过流,但总是同时使用整个流。所以现在我有点迷失了,我必须逐字节考虑文件。具体来说,我将如何在文件中间删除或插入字节?我尝试通过 FileStream 将文件读入字节数组 (byte[]),如下面的代码所示。

System.IO.FileStream waveFileStream = System.IO.File.OpenRead(@"C:\sound.wav");
byte[] waveBytes = new byte[waveFileStream.Length];
waveFileStream.Read(waveBytes, 0, waveBytes.Length);

我可以通过 Visual Studio 调试器看到前四个字节是文件的 RIFF 标头。 替代文字

但是,在执行更改其大小的操作(例如插入或删除值)时,数组是一件很痛苦的事情。所以我在想我可以然后将 byte[] 变成这样的 List。

List<byte> list = waveBytes.ToList<byte>();

这将使逐字节对文件的任何操作变得容易得多,但我担心我可能会丢失 System.IO 命名空间中的类之类的东西,这会使这一切变得更加容易。我在正确的轨道上,还是有更好的方法来做到这一点?我还应该提到,我不太关心性能,并且不想像this guy那样处理指针或不安全的代码块。

如果它有帮助,这里有一篇关于 RIFF/WAV 文件格式的好文章。

4

1 回答 1

1

我不是用 C# 编写的,但可以指出一些我认为不好的地方:

1) 不要读取内存中的整个 WAV 文件,除非这些文件是您自己的文件并且故意具有较小的大小。

2) 无需在内存中插入数据。例如,您可以简单地执行以下操作:分析源文件,存储块的偏移量,并在内存中读取元数据;在对话框中显示元数据以进行编辑;同时保存写入RIFF-WAV头,fmt块,从源文件传输音频数据(通过读写块),添加元数据;更新 RIFF-WAV 标头。

3)尝试将元数据保存在文件的尾部。这将导致仅交替标记不需要重写整个文件。

似乎这里有一些关于在 C# 中使用 RIFF 文件的资料。

于 2010-04-11T23:04:54.083 回答