Pregunta

Me gustaría usar la biblioteca. NReplayGain para calcular la reproducción de un archivo MP3 y luego usar TagLibSharp biblioteca (con las modificaciones no oficiales de soporte de repetición de código abierto) para escribir el ID3v2 etiquetas replaygain en el archivo.

Bueno, este debería ser el pseudocódigo para calcular la ganancia de reproducción de un conjunto de muestras usando la biblioteca NReplayGain como indica su sitio web: 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()

(...Pero si tengo que ser honesto, no sé exactamente qué es un SampleSet (¿todos los fotogramas unidos?))

Antes de intentar calcular el ReplayGain del conjunto de muestras, necesito obtener los datos necesarios que debo pasar al código anterior, por lo que necesito obtener el samplerate, SampleSet, leftSamples y rightSamples de un archivo MP3.

Necesito un ejemplo de código completo de cómo puedo recuperar esos datos usando NAudio lib o cualquier otro tipo de lib que pueda hacerlo.

La razón por la que pido un código completo es porque con menos sé que no podría hacerlo solo, he tocado un poco antes la librería de NAudio para otras cosas y me resulta sumamente difícil, parece que La biblioteca fue escrita solo para programadores Audio Master y Audio guru, no lo tiene nada fácil.

¿Fue útil?

Solución

Nunca he oído hablar de un "conjunto de muestras".Pero como puedo ver hasta ahora, un conjunto de muestras solo contiene muestras del canal izquierdo y derecho.Podrías usar CScore para acceder a todas las muestras de una pista de una manera bastante sencilla:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top