音频文件中的字节位置秒

时间:2015-09-09 13:15:10

标签: math audio vb6

我有一个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

1 个答案:

答案 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,因为你的数据是对齐的 - 如果你想从那个位置回放,例如你的左右会保持左右。