Math 音频文件中字节位置的秒数
我有一个波形文件。 我已经删除了标题并将音频数据读入字节数组 我想找出给定时间值的字节位置,例如672911493013085E-02秒 我编写了一个转换器函数: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&
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个样品,则使用地板。否则使用中点舍入。