Uso de CSCore lib para obtener información y datos de muestra de un archivo MP3
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.
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