我正在用C#编写一个应用程序,它将记录音频文件(*.wav)并自动标记和命名它们。波形文件是RIFF文件(如AVI),除了波形数据块外,还可以包含元数据块。所以,现在我试图弄清楚如何从记录的波形文件中读取和写入RIFF元数据。
我使用NAudio记录文件,并在他们的论坛上询问作为好吧,所以的读取和写入RIFF标记的方式。虽然我收到了许多很好的答案,但是没有一个解决方案允许像我想的那样轻松地阅读和。
但更重要的是,我很少有处理字节级文件的经验,并且认为这可能是一个学习的好机会。因此,现在我想尝试编写我自己的类(Es),它可以在一个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调试器,我可以看到前四个字节是文件的RIFF头。

但是,当执行更改数组大小的操作(例如插入或删除值)时,要处理数组的痛苦。所以我想我可以把byte[]变成这样的列表。
List<byte> list = waveBytes.ToList<byte>();这将使逐字节操作文件变得非常容易,但我担心我可能遗漏了一个类似于System.IO名称中的类的东西--这将使所有这些操作变得更加容易。我是在正确的轨道上,还是有更好的方法来做到这一点?我还应该提到,我不太关心性能,也不喜欢处理指针或不安全的代码块,比如这家伙。
如果有帮助的话,这里是一篇好文章 /WAV文件格式。
发布于 2010-04-11 23:04:54
我不是用C#写的,但我可以指出一些从我的角度来看是不好的地方:
1)不要在内存中读取整个WAV文件,除非这些文件是您自己的文件,并且在知情的情况下具有较小的大小。
2)没有必要在内存中插入数据。例如,您可以简单地执行以下操作:分析源文件、存储块偏移集和在内存中读取元数据;在对话框中显示用于编辑的元数据;同时保存写RIFF-WAV头、fmt块、从源文件(通过读取和写入块)传输音频数据、添加元数据、更新RIFF-WAV报头。
3)尝试将元数据保存在文件尾部。这将导致交替只标签将不需要重写整个文件。
似乎有一些关于在C#中使用RIFF文件的消息来源是这里。
https://stackoverflow.com/questions/2618861
复制相似问题