我写在C#中的应用程序,将记录的音频文件(支持* .wav),并自动标记,并为它们命名。波形文件RIFF文件(如AVI),它可以包含除了波形数据块的元数据块。所以现在我想弄清楚如何读写RIFF元数据,并从记录的波形文件。

我使用n音讯记录的文件,并要求在他们的论坛以及对SO 获取的方式来读写RIFF标签。虽然我获得了一些很好的答案,没有一个解决方案允许读写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 Studio调试器看到的是,第一四个字节是该文件的标头RIFF。 “替代文字”

但是,阵列是一个痛苦的处理执行该改变它们的大小像插入或取出值动作时用。所以,我想我可以再到字节[]到像这样的列表。

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

这将使该文件字节的任何操作按字节轻松许多,但是我担心我可能失去了一些东西就像在System.IO命名空间中的类,这将使这一切更容易。我在正确的轨道上,还是有更好的方法来做到这一点?我还想说,我不是巨大的关心性能,并且宁愿不应对指针或不安全的代码块类似的这个人

如果它有助于在所有这里是一篇好文章的RIFF / WAV文件格式。

有帮助吗?

解决方案

我没有在C#写的,但可以在一些地方哪些是坏的,从我的观点指出:

1)不要读记忆整个WAV文件,除非该文件是你自己的文件,明知有小的尺寸。

2)没有必要在存储器中插入数据。你可以简单地例如做一下下面:分析源文件,块储存偏移量,并在内存中读取的元数据;提出一种用于在对话框编辑元数据;同时节省写RIFF-WAV头,FMT块,从源文件传输音频数据(通过读取和写入块)中,添加的元数据;更新RIFF-WAV头。

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

看来关于C#与RIFF文件工作的一些源存在这里

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top