Math 音频文件中字节位置的秒数

Math 音频文件中字节位置的秒数,math,audio,vb6,Math,Audio,Vb6,我有一个波形文件。 我已经删除了标题并将音频数据读入字节数组 我想找出给定时间值的字节位置,例如672911493013085E-02秒 我编写了一个转换器函数: Public Function SecondsToBytePos(ByVal uSeconds As Double, ByVal uSamplesPerSecond As Long, ByVal uChannels As Long, ByVal uBitsPerSample) As Long Dim lRet&

我有一个波形文件。 我已经删除了标题并将音频数据读入字节数组

我想找出给定时间值的字节位置,例如672911493013085E-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
但是当我使用

第二步步骤OS672911493013085E-0248000,1,16

我得到的是偶数6460

这是不正确的,因为字节数组是以零为基础的,所以值必须是奇数

2个字节组成1个双精度/浮点值,因此可能永远不会出现偶数值

有人看到我的转换器功能有任何缺陷吗

谢谢你的帮助

编辑:这里有一种不同的方法:

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

您认为返回值必须是奇数的假设是错误的,因为您正在转换为字节,而不是样本或帧

如果您想要在时间uSeconds开始的第一个通道的第一个样本的字节位置:

frameNumber = Floor(uSeconds * uSamplesPerSecond)
bytePos = frameNumber * numChannels * bitsPerSample/8
sampleNumber = Floor(uSeconds * uSamplesPerSecond * numChannels)
bytePos = sampleNumber * bitsPerSample/8
bytePos将是numChannels*bitsPerSample/8的倍数

如果您想要在时间uSeconds开始的任何通道的第一个样本的字节位置:

frameNumber = Floor(uSeconds * uSamplesPerSecond)
bytePos = frameNumber * numChannels * bitsPerSample/8
sampleNumber = Floor(uSeconds * uSamplesPerSecond * numChannels)
bytePos = sampleNumber * bitsPerSample/8
这里bytePos是bitsPerSample/8的倍数


我怀疑您希望帧号与数据对齐-例如,如果您希望从该位置播放,您的左和右将保持左和右。

文件是mono。示例为1个双精度/平坦值,表示2个字节。你仍然认为我的假设是错误的吗?是的,它适用于各种情况。考虑一个简单的例子。1秒48kHz音频,单声道,16位。首先将转换为字节数,即96000。然后,您将使用秒来索引该数字。如果您在0.5秒时请求字节,那么您将得到48000。如果您请求0.5+1/48000.0处的字节,您将得到48001。我的答案是,在索引之前,你需要保留你想要的框架,然后将答案转换成字节。我不相信Floor。我在我的帖子中添加了另一种方法。我也可以使用这个BlockAlign方法吗?您添加的代码只适用于16位样本,并且有点复杂。我不知道你为什么不相信地板。由于秒是浮点数,因此您将得到与8.952示例类似的答案。如果您的要求是返回第8个样品,则使用地板。否则使用中点舍入。