استخدام CSCore lib للحصول على بيانات ومعلومات نموذجية لملف MP3

StackOverflow https://stackoverflow.com//questions/20019890

سؤال

أرغب في استخدام المكتبة 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top