c# - WAV文件修剪和添加静音

时间:2016-12-30 01:41:13

标签: c# audio ffmpeg wav naudio

我有两个同一事件的记录,不同的长度,在不同的时间开始。我想同步它们,时间偏移是已知的。我想实现以下目标:

  1. 按时间偏移对齐第二个。
  2. 修剪第二个以匹配第一个的长度
  3. 当无法修剪时,添加静音以匹配第一个的长度。

    我找到了修剪音频的方法,但我无法找到增加沉默的解决方案。有没有办法用NAudio,ffmpeg或Aurio做这个?

2 个答案:

答案 0 :(得分:0)

很抱歉没有回复,但我使用ffmpeg解决了我的问题。以下是我的完成方式:
ffmpeg -f lavfi -i aevalsrc=0:d=8.375 -i inputfile.wav -filter_complex "[0:0] [1:0] concat=n=2:v=0:a=1" -ss 0 -to 63.787 outputfile.wav

-i aevalsrc=0:d=8.375会产生8.375秒的持续时间(d)的沉默。
-filter_complex "[0:0] [1:0] concat=n=2:v=0:a=1合并沉默和输入文件。 - Concatenation -ss 0 -to 63.787修剪输出(从第一个文件的开头到第一个文件的长度,即63.787,如果输入比这个短,输出文件有输入文件的持续时间) - {{ 3}}

如果偏移值为负,那么它是:

ffmpeg -i inputfile.wav -ss 22.316 -t 54.213 outputfile.wav

因此输出文件是输入文件的开始从22.316秒持续54.213秒
我使用NReco.VideoConverter作为ffmpeg包装。

答案 1 :(得分:0)

这是一种使用NAudio以毫秒级写静音的方法:

public static void WriteSilence(WaveFormat waveFormat, 
   int silenceMilliSecondLength, WaveFileWriter waveFileWriter)
{
    int bytesPerMillisecond = waveFormat.AverageBytesPerSecond / 1000;
    //an new all zero byte array will play silence
    var silentBytes = new byte[silenceMilliSecondLength * bytesPerMillisecond];
    waveFileWriter.Write(silentBytes, 0, silentBytes.Length);
    waveFileWriter.Dispose();
}