استخدام CSCore lib للحصول على بيانات ومعلومات نموذجية لملف MP3
سؤال
أرغب في استخدام المكتبة NReplayGain
لحساب إعادة تشغيل ملف MP3 ثم استخدامه TagLibSharp
مكتبة (مع تعديلات دعم إعادة التشغيل مفتوحة المصدر غير الرسمية) لكتابة ملف ID3v2
إعادة تشغيل العلامات في الملف.
حسنًا، يجب أن يكون هذا هو الرمز الزائف لحساب إعادة تشغيل مجموعة العينات باستخدام NReplayGain lib كما يشير موقع الويب: 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 أو أي نوع آخر من lib يمكنه القيام بذلك.
السبب الذي يجعلني أطلب رمزًا كاملاً هو أنني مع القليل من المعرفة التي لا أستطيع القيام بها بنفسي، لقد تطرقت أمام مكتبة NAudio قليلاً لأشياء أخرى وهي صعبة للغاية بالنسبة لي، يبدو ذلك تم كتابة libray فقط لمبرمجي 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