使用 NAudio 拆分 Wav 文件会从每个部分删除 1 秒

Posted

技术标签:

【中文标题】使用 NAudio 拆分 Wav 文件会从每个部分删除 1 秒【英文标题】:Splitting a Wav File using NAudio removes 1 second from each part 【发布时间】:2018-02-16 12:46:43 【问题描述】:

我正在使用 NAudio 将 Wav 文件拆分为多个等间隔的部分。我正在使用 Mark Heath 在 Sound Code 上提供的代码版本:

 public static void TrimWavFile(string inPath, string outPath, TimeSpan cutFromStart, TimeSpan cutFromEnd)
        
            using (WaveFileReader reader = new WaveFileReader(inPath))
            
                using (WaveFileWriter writer = new WaveFileWriter(outPath, reader.WaveFormat))
                
                    //int bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond / 1000;
                    float bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond / 1000f;
                    int startPos = (int)cutFromStart.TotalMilliseconds * (int)bytesPerMillisecond;
                    startPos = startPos - startPos % reader.WaveFormat.BlockAlign;

                    int endBytes = (int)cutFromEnd.TotalMilliseconds * (int)bytesPerMillisecond;
                    endBytes = endBytes - endBytes % reader.WaveFormat.BlockAlign;
                    int endPos = (int)reader.Length - endBytes;

                    TrimWavFile(reader, writer, startPos, endPos);
                
            
        

    private static void TrimWavFile(WaveFileReader reader, WaveFileWriter writer, int startPos, int endPos)
    
        reader.Position = startPos;
        byte[] buffer = new byte[reader.WaveFormat.BlockAlign * 100];
        while (reader.Position < endPos)
        
            int bytesRequired = (int)(endPos - reader.Position);
            if (bytesRequired > 0)
            
                int bytesToRead = Math.Min(bytesRequired, buffer.Length);
                int bytesRead = reader.Read(buffer, 0, bytesToRead);
                if (bytesRead > 0)
                
                    writer.Write(buffer, 0, bytesRead);
                
            
        
    

这是拆分 Wav 文件,但每个部分比指定的间隔短 1 秒。我不知道这是代码还是库本身的问题。有没有人遇到过同样的问题?如果是这样,有没有人能够解决它?

编辑 这是我要发送给函数的内容:

    TimeSpan cutFromStart = new TimeSpan(0, 0, 0);
    TimeSpan cutFromEnd = new TimeSpan(0, 0, 0);
            cutFromEnd = totalTime.Subtract(interval);
            for (i = 0; i < numberOfParts; i++)
            
                outPath = inpath + prefix + (i + 1).ToString() + ".wav";
                TrimWavFile(inPath, outPath, cutFromStart, cutFromEnd);
                cutFromStart = cutFromStart.Add(interval);
                cutFromEnd = cutFromEnd.Subtract(interval);

            

【问题讨论】:

您确定传入的值正确吗? cutFromEnd 指定从文件末尾剪切的持续时间,而不是保留的持续时间 @MarkHeath 是的TimeSpan cutFromEnd = totalTime.Subtract(interval); 【参考方案1】:

我怀疑你的位置计算有错误。

但也许你会发现使用这种技术更容易

using (var reader = new AudioFileReader(inPath))

    reader.CurrentTime = startTime; // jump forward to the position we want to start from
    WaveFileWriter.CreateWaveFile16(outPath, reader.Take(duration));

【讨论】:

工作就像一个魅力。仍然无法理解我的代码中的错误是什么。也许某处存在舍入错误?

以上是关于使用 NAudio 拆分 Wav 文件会从每个部分删除 1 秒的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 将 WAV 文件转换为 2 个单独的 PCM 文件

NAudio - 读取和写入 Wav 文件

使用 NAudio 处理后播放 wav 文件

使用 NAudio 将 g722 音频转换为 WAV

C# 使用 NAudio 转换 wav 文件

在 NAudio 中添加 WAV 标头