gpt4 book ai didi

c# - 需要帮助在字节级操作 WAV (RIFF) 文件

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:56 24 4
gpt4 key购买 nike

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

我正在使用 NAudio 来录制文件,并在 their forums 上询问过作为well on SO用于读取和写入 RIFF 标签的方法。虽然我收到了很多不错的答案,但没有一个解决方案能够像我希望的那样轻松地阅读编写 RIFF block 。

但更重要的是,我在字节级别处理文件的经验很少,我认为这可能是一个很好的学习机会。所以现在我想尝试编写自己的类,它可以读取 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 header 。 alt text

但是,在执行更改其大小(如插入或删除值)的操作时,数组很难处理。所以我想我可以将 byte[] 放入这样的列表中。

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

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

如果有帮助的话,这里是a good article关于 RIFF/WAV 文件格式。

最佳答案

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

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

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

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

似乎存在一些关于在 C# 中使用 RIFF 文件的资源 here .

关于c# - 需要帮助在字节级操作 WAV (RIFF) 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2618861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com