Verwenden von CSCore lib zum Abrufen von Beispieldaten und -informationen für eine MP3-Datei
Frage
Ich möchte die Bibliothek nutzen NReplayGain
um die Wiedergabedauer einer MP3-Datei zu berechnen und dann zu verwenden TagLibSharp
bibliothek (mit den nicht offiziellen OpenSource replaygain Support-Modifikationen) zum Schreiben der ID3v2
wiederhole Tags in die Datei.
Nun, dies sollte der Pseudocode sein, um den Wiederholungsgewinn eines Samplesets mithilfe der NReplayGain-Bibliothek zu berechnen, wie auf der Website angegeben: 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()
(...Aber wenn ich ehrlich sein muss, weiß ich nicht genau, was ein SampleSet ist (alle Frames verbunden?))
bevor ich versuche, den Wiederholungsgewinn des Samplesets zu berechnen, muss ich die erforderlichen Daten abrufen, die ich an den obigen Code übergeben muss, damit ich die samplerate
, SampleSet
, leftSamples
und rightSamples
einer MP3-Datei.
Ich benötige ein vollständiges Codebeispiel dafür, wie ich diese Daten mit abrufen kann NAudio
lib oder jede andere Art von lib, die es tun könnte.
Der Grund, warum ich nach einem vollständigen Code frage, ist, dass ich mit weniger weiß, dass ich es nicht alleine schaffen könnte, ich habe die NAudio-Bibliothek ein wenig für andere Dinge berührt und es ist extrem schwer für mich, es scheint, dass die Bibliothek nur für Audio-Master-Programmierer und Audio-Gurus geschrieben wurde, die es nicht leicht haben.
Lösung
Noch nie von einem "Sampleset" gehört.Aber wie ich bisher sehen kann, enthält ein Sampleset nur Samples des linken und rechten Kanals.Sie könnten verwenden CSCore ganz einfach auf alle Samples eines Tracks zugreifen:
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