我有一个wave文件(PCM)。 我删除了标题并将音频数据读入字节数组。
我想找出给定时间值的字节位置(例如6,72911493013085E-02秒)。
我写了一个转换函数:
Public Function SecondsToBytePos(ByVal uSeconds As Double, ByVal uSamplesPerSecond As Long, ByVal uChannels As Long, ByVal uBitsPerSample) As Long
Dim lRet&
lRet = (uSeconds * ((uSamplesPerSecond * uChannels * uBitsPerSample) / 8))
SecondsToBytePos = lRet
End Function
但是当我使用
时SecondsToBytePos(6,72911493013085E-02,48000,1,16)
我得到了偶数值6460。
这可能不正确,因为字节数组是从零开始的,所以该值必须是奇数。
2个字节构成1个double / float值,因此偶数值可能永远不会发生。
有人看到我的转换器功能有任何缺陷吗?
感谢您的帮助。
编辑:这是一种不同的方法:
Public Function SecondsToBytePos(ByVal uSeconds As Double, ByVal uSamplesPerSecond As Long, ByVal uChannels As Long, ByVal uBitsPerSample) As Long
Dim g_lBlockAlign As Long=2
Dim lret&
lret = (uSeconds * ((uSamplesPerSecond * uChannels * uBitsPerSample) / 8))
If (lret Mod g_lBlockAlign) > 0 Then
Dim lRem&
lRem = (lret \ g_lBlockAlign) + 1
lret = lRem * g_lBlockAlign
End If
SecondsToBytePos = lret
End Function
答案 0 :(得分:0)
您认为返回值需要为奇数的假设是错误的 - 因为您要转换为字节而不是样本或帧。
如果您希望第一个通道的第一个样本的字节位置从时间uSeconds开始:
frameNumber = Floor(uSeconds * uSamplesPerSecond)
bytePos = frameNumber * numChannels * bitsPerSample/8
bytePos将是numChannels * bitsPerSample / 8
的倍数如果您希望 ANY 通道的第一个样本的字节位置从时间uSeconds开始:
sampleNumber = Floor(uSeconds * uSamplesPerSecond * numChannels)
bytePos = sampleNumber * bitsPerSample/8
这里bytePos将是bitsPerSample / 8的倍数
我怀疑你想要frameNumber,因为你的数据是对齐的 - 如果你想从那个位置回放,例如你的左右会保持左右。