美文网首页
使用Go播放音频:更改振幅

使用Go播放音频:更改振幅

作者: 豆腐匠 | 来源:发表于2020-09-09 15:17 被阅读0次

原文地址:https://dylanmeeus.github.io/posts/audio-from-scratch-pt3/

在上一篇文章中我们编写了用于读取和写入WAVE文件的代码。因此,现在该开始使用此功能来实际处理一些声音了。这篇文章的目标很简单,我们要更改给定.wave文件的振幅。

为此,我将导入在第2部分中编写的库。

这篇文章的代码也在 Github中。

改变幅度

更改幅度需要三个输入:

  • 输入文件:.wave输入
  • 输出文件:.wave输出
  • ampfac:缩放幅度的因子

为了解析这些参数,我们将使用内置flags包。

var (
    input  = flag.String("i", "", "input file")
    output = flag.String("o", "", "output file")
    amp    = flag.Float64("a", 1.0, "amp mod factor")
)

接下来,我们要解析这些值,并从输入文件中读取音频数据。

func main() {
    flag.Parse()
    infile := *input
    outfile := *output
    scale := *amp
    wave, err := pkg.ReadWaveFile(infile)
    if err != nil {
        panic("Could not parse wave file")
    }
        ...
}

因此,现在我们该如何实际改变刚刚读取的音频文件的幅度?

在音频文件中,我们有原始音频数据(类型为Sample = float64)。这些float64样本值表示不同时间点的幅度。因此,为了操纵振幅,我们必须操纵这些值。

我们可以像下面这样:

    scaledSamples := changeAmplitude(wave.Samples, scale)
    if err := pkg.WriteSamples(scaledSamples, wave.WaveFmt, outfile); err != nil {
        panic(err)
    }
    fmt.Println("done")

在这里,我们刚刚将函数命名为“ changeAmplitude”,该函数要求我们传递Samples和一个比例因子,然后返回新的Samples。

如前文所述,我们可以改变样本本身来改变幅度。

func changeAmplitude(samples []pkg.Sample, scalefactor float64) []pkg.Sample {
    for i, s := range samples {
        samples[i] = pkg.Sample(float64(s) * scalefactor)
    }
    return samples
}

这就是全部。给定用户传递的比例因子,我们将每个样本乘以该因子以获得一个新样本。最后,我们返回我们的新样本并将其写入输出文件。我们的GoAudio库再次处理了将这些样本实际写入wave文件的工作 。

运行代码

现在我们可以运行代码了,我们可以传递一个输入文件,命名一个输出文件以及一个比例因子来更改音频,例如,将声音文件的振幅加倍,我们可以使用以下命令:

go run main.go -i sound.wav -o out.wav -a 2

结果如下:

原来 翻了一番

这种更改效果是非常微弱的,因此下面是原始来源乘以5的效果:

5倍

失真也开始在这里出现了。:-)

相关文章

网友评论

      本文标题:使用Go播放音频:更改振幅

      本文链接:https://www.haomeiwen.com/subject/uiueektx.html