Usando CSCore lib para obter dados e informações de amostra de um arquivo MP3
Pergunta
Eu gostaria de usar a biblioteca NReplayGain
para calcular o replaygayn de um arquivo MP3 e então usar TagLibSharp
biblioteca (com as modificações não oficiais de suporte ao replaygain de código aberto) para escrever o ID3v2
tags replaygain no arquivo.
Bem, este deve ser o pseudocódigo para calcular o replaygain de um conjunto de amostras usando a biblioteca NReplayGain conforme o site indica: https://github.com/karamanolev/NReplayGain
Dim trackGain As New TrackGain(samplerate, samplesize)
For Each sampleSet As SampleSet In track
trackGain.AnalyzeSamples(sampleSet.leftSamples, sampleSet.rightSamples)
Next
Dim gain As Double = trackGain.GetGain()
Dim peak As Double = trackGain.GetPeak()
(...Mas para ser honesto, não sei exatamente o que é um SampleSet (todos os quadros unidos?))
antes de tentar calcular o ReplayGain do conjunto de amostras, preciso obter os dados necessários que preciso passar para o código acima, portanto, preciso obter o samplerate
, SampleSet
, leftSamples
e rightSamples
de um arquivo MP3.
Preciso de um exemplo de código completo de como posso recuperar esses dados usando NAudio
lib ou qualquer outro tipo de lib que possa fazer isso.
A razão pela qual estou pedindo um código completo é porque com menos eu sei que não conseguiria fazer isso sozinho, já mexi um pouco na biblioteca NAudio para outras coisas e é extremamente difícil para mim, parece que a biblioteca foi escrita apenas para programadores Audio Master e gurus de áudio, não é nada fácil.
Solução
Nunca ouvi falar de um "conjunto de amostras".Mas, como posso ver até agora, um conjunto de amostras contém apenas amostras dos canais esquerdo e direito.Você poderia usar CSCore para acessar todos os samples de uma faixa de uma forma bastante fácil:
Option Strict On
Imports CSCore
Imports CSCore.Codecs
Module Test
Sub Main()
Dim source As IWaveSource = CodecFactory.Instance.GetCodec("C:\Temp\test.mp3")
Dim sampleSource As ISampleSource = source.ToSampleSource()
Dim sampleBuffer(source.WaveFormat.SampleRate * source.WaveFormat.Channels) As Single
Dim sampleRate As Integer = source.WaveFormat.SampleRate
Dim channelCount As Short = source.WaveFormat.Channels
Dim read As Integer
Dim leftSamples As New List(Of Single)
Dim rightSamples As New List(Of Single)
Do
'now iterate through the sampleBuffer
For i = 0 To read Step channelCount
If channelCount = 1 Then 'mono
leftSamples.Add(sampleBuffer(i))
ElseIf channelCount = 2 Then
leftSamples.Add(sampleBuffer(i))
rightSamples.Add(sampleBuffer(i + 1))
Else
Throw New NotSupportedException("3 or more channels are not supported.")
End If
Next
Loop While read > 0
'now you've got all samples in a range of -1 to 1
'do what ever you need to do with them
End Sub
End Module