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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top