.net 如何将RIFF块数据写入使用NAudio制作的WAV文件?

92dk7w1h  于 2023-03-13  发布在  .NET
关注(0)|答案(2)|浏览(228)

如何将RIFF块数据写入WAV文件的**结尾?是的,没错,写入WAV文件的结尾。*为什么?因为我替换的旧程序就是这样做的,集成程序也是这样准备的, 它们无法修改 *。

mznpcxlj

mznpcxlj1#

就我个人而言,我会使用BASS .NET,它确实处理RIFFICMT标记。
EncoderWAV类提供了一个WAV_AddRiffInfo属性来允许这样做。

// re-encodes a file and adds a comment to it.    
var init = Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero);
if (init)
{
    int channel = Bass.BASS_StreamCreateFile("filename", 0, 0, BASSFlag.BASS_STREAM_DECODE);
    var tagInfo = new TAG_INFO { comment = "your comment" };
    var encoderWav = new EncoderWAV(channel);
    encoderWav.WAV_AddRiffInfo = true;
    encoderWav.TAGs = tagInfo;
    encoderWav.OutputFile = "output.wav";
    var start = encoderWav.Start(null, IntPtr.Zero, false);
    Bass.Free();
}

注意:不要忘记将bass.dll放在.EXE所在的位置

(at首先,BASS是一个C库,BASS.NET为它提供了一个 Package 器,但也提供了许多原始库中没有的很酷的东西,如编码器、可视化器等...)
IMO BASS.NET是最好的.NET音频库,尤其是低级的东西,实际上这是唯一的一个:-)

8i9zcol2

8i9zcol22#

好吧,最后它并不是一个标准的格式。我们通过利用Mark Heath所说的CueWaveFileWriter发现了这一点。格式实际上是非常定制的,看起来更像这样:

LIST - this is a one-time blurb of text.
Tag Name (e.g. ICOP for copyright)
4 bytes indicating the length of the following value + 1. The 1 was a (byte)0 terminator.
Value

下面是一个示例:

ICOP<bh:15><bh:00><bh:00><bh:00>4/5/2013 10:48:40 AM<bh:00>

因此,要完成此操作,我们只需要创建一个BinaryWriter,并将它们直接写出如下:

using (BinaryWriter bw = new BinaryWriter(writer))
{
    foreach (var item in RIFFChunks)
    {
        if (!(bw.BaseStream.Position % 2 == 0))
        {
            bw.Write((byte)0);
        }

        bw.Write(Encoding.Default.GetBytes(item.Key));
        bw.Write(item.Value.Length + 1);
        bw.Write(Encoding.Default.GetBytes(item.Value));
        bw.Write((byte)0);
    }
}

你可能需要注意if (!(bw.BaseStream.Position % 2 == 0))这一行,它必须存在,因为每个标签名必须从偶数偏移开始,老实说我不知道为什么,我只知道它存在。
我不得不说,虽然,有一个很好的机会,我现在可以逆向工程几乎任何文件格式。但真的,有什么好处呢?

相关问题