Использование библиотеки CSCore для получения данных и информации образца MP3-файла.
Вопрос
Я хотел бы воспользоваться библиотекой NReplayGain
чтобы рассчитать повтор воспроизведения файла MP3, а затем использовать TagLibSharp
библиотеку (с неофициальными модификациями поддержки replaygain с открытым исходным кодом) для написания ID3v2
теги replaygain в файл.
Что ж, это должен быть псевдокод для расчета коэффициента усиления набора сэмплов с использованием библиотеки NReplayGain, как указано на веб-сайте: 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()
(...Но если честно, я не знаю точно, что такое SampleSet (все кадры объединены?))
прежде чем пытаться вычислить ReplayGain набора образцов, мне нужно получить необходимые данные, которые мне нужно передать в приведенный выше код, поэтому мне нужно получить samplerate
, SampleSet
, leftSamples
и rightSamples
файла MP3.
Мне нужен полный пример кода того, как я могу получить эти данные, используя NAudio
lib или любая другая библиотека, которая может это сделать.
Причина, по которой я прошу полный код, заключается в том, что, зная меньше, я не смог бы сделать это сам, раньше я немного коснулся библиотеки NAudio для других вещей, и для меня это чрезвычайно сложно, кажется, что Библиотека была написана специально для программистов Audio Master и аудио-гуру, которым не так-то просто.
Решение
Никогда не слышал о "наборе образцов".Но, насколько я понимаю, набор сэмплов содержит только сэмплы левого и правого канала.Вы могли бы использовать CSCore получить доступ ко всем семплам трека довольно простым способом:
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