MP3 の再生に使用しているものを指定しませんでした。しかし、私はそのためにBASSを使用しています。あなたの質問は彼らのフォーラムで尋ねられました。ここにあります。ところで、 C# で BASS を使用するには、BASS の .NET ラッパーであるBASS .NETが必要になる場合があります。
問題の変更による編集:
上記のリンクで bass.dll を使用できます。.NET ラッパーをダウンロードし、参照に追加します。VB 6 の例を次に示します。long を integer に、integer を short に変更するだけで、関数名は同じになります。ここからアイデアを得る必要があります。
Public Sub GetSilenceLength(ByVal file As String, ByVal threshold As Long, ByRef startp As Long, ByRef endp As Long)
Dim buf(50000) As Integer
Dim count As Long, pos As Long
Dim chan As Long
Dim a As Long, b As Long
Dim c As Long, d As Long
count = 0
chan = BASS_StreamCreateFile(BASSFALSE, file, 0, 0, BASS_STREAM_DECODE) 'create decoding channel
If (chan = 0) Then Exit Sub
Do
b = BASS_ChannelGetData(chan, buf(0), 20000) 'decode some data
b = b / 2 'bytes -> samples
a = 0
Do 'count silent samples
a = a + 1
Loop While ((a < b) And (Abs(buf(a)) <= threshold))
count = count + (a * 2)
If (a < b) Then 'sound has bagun
'move back to a quieter sample (to avoid "click")
Do
a = a - 1
count = count - 2
Loop While ((a) And (Abs(buf(a)) > threshold / 4))
Exit Do
End If
Loop While (BASS_ChannelIsActive(chan))
startp = count
pos = BASS_StreamGetLength(chan)
Do
pos = IIf(pos < 100000, 0, pos - 100000) 'step back a bit
BASS_ChannelSetPosition chan, pos
d = BASS_ChannelGetData(chan, buf(0), 100000) ' decode some data
d = d / 2 'bytes -> samples
c = d
Do
c = c - 1 'count silent samples
Loop While (c > 0) And (Abs(buf(c)) <= threshold / 2) 'Here is the correction
If (c > 0) Then 'sound has begun
count = pos + c * 2
Exit Do
End If
Loop While (pos > count)
endp = count
BASS_StreamFree (chan)
End Sub
また、フェードが必要な場合は、別のまだ簡単な話です.