CSCore lib を使用して MP3 ファイルのサンプル データと情報を取得する
質問
図書館を利用したいのですが NReplayGain
MP3 ファイルのリプレイゲインを計算してから使用します。 TagLibSharp
ライブラリ (非公式のオープンソース リプレイゲイン サポートの修正を含む) を使用して、 ID3v2
ファイルにリプレイゲインタグを追加します。
これは、Web サイトに示されているように、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 プログラマと Audio の達人のためだけに書かれたもので、簡単なことは何もありません。
解決
「サンプルセット」について聞いたことはありません。しかし、これまで見てきたように、サンプルセットには左チャンネルと右チャンネルのサンプルが含まれているだけです。使用できます CSコア 非常に簡単な方法でトラックのすべてのサンプルにアクセスするには:
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