Algorithm 基于两个不同系列的通用刻度

Algorithm 基于两个不同系列的通用刻度,algorithm,math,Algorithm,Math,以下问题困扰了我一段时间: 我有两个数字系列,一个代表视频时间戳,另一个代表音频时间戳。这两者使用不同的尺度,视频以纳秒为单位,音频以微秒为单位(或者反过来说,或者微秒和纳秒,或者其他任何方式,重要的是它们并不相同,因为它们始终来自两个不同的硬件设备)。现在,我想从这两个视频流中创建一个视频流,显然其中一个总是关闭的。到目前为止,我已经破解了一个解决方案,我总是使用“较大”的一个作为主流,但这导致了另一个流的问题,例如音频故障或冻结图片 现在,我需要制定一个有效的解决方案,即从这两个系列创建一个

以下问题困扰了我一段时间:

我有两个数字系列,一个代表视频时间戳,另一个代表音频时间戳。这两者使用不同的尺度,视频以纳秒为单位,音频以微秒为单位(或者反过来说,或者微秒和纳秒,或者其他任何方式,重要的是它们并不相同,因为它们始终来自两个不同的硬件设备)。现在,我想从这两个视频流中创建一个视频流,显然其中一个总是关闭的。到目前为止,我已经破解了一个解决方案,我总是使用“较大”的一个作为主流,但这导致了另一个流的问题,例如音频故障或冻结图片

现在,我需要制定一个有效的解决方案,即从这两个系列创建一个通用的时间戳基础。你能帮我吗

例如,我得到的数据与此类似:

VIDEO: 100 150 200 250

AUDIO: 1000 1500 2000 3000 5000
我希望输出是一个系列,就像

A(??)V(??)A(??)V(??)等等。。。。哪里在不同的尺度上,视频和音频时间戳之间的差异明显不同

谢谢,
f、

这个问题很科学(虽然很简单),而且实现起来也不是那么简单

首先要注意的是:您实际上有第三个时间刻度-系统时间

需要注意的第二件事:您无法直接找到与给定音频时间戳对应的视频时间戳,反之亦然但您可以直接找到与刚刚到达的视频时间戳或刚刚到达的音频时间戳对应的系统时间

所以你可以(1)找到从视频时间刻度到系统时间的线性转换,(2)从音频时间刻度到系统时间的线性转换

现在,您可以找到从视频时间戳到音频时间戳的转换,或者从音频时间戳到视频时间戳的转换

然后,您必须选择参考时间刻度-视频或音频或系统时间。您可以根据需要将任何时间刻度的时间戳转换为参考时间刻度

注意每个单独的音频样本都有自己的时间戳,应将其转换为新的时间刻度,以便输出采样率与输入采样率不同。由于您的线性转换可能是自适应的,所以对于不同的音频数据包,输出采样率将不同。所有这一切意味着,如果您的参考时间刻度不是音频时间刻度,您必须仔细地使用您选择的算法(如线性或更高级的算法)将每个音频数据包重新采样到您选择的(恒定)采样率。否则,如果假设采样率没有改变,则音频数据包之间会有间隙和/或重叠(这将导致非常不愉快的音频伪影)

这种方法最重要的子任务是线性缩减:在给定一组样本点的情况下,在
x
y
之间找到最佳的线性转换

这项任务通常是这样定义的:对于一组给定的点(xn,yn)(k,b),使(yn-(k*xn+b))2的和最小(最小平方差和)

答案是

k=(M(x*y)-M(x)*M(y))/(M(x2)-(M(x))2,b=(M(y)(M(x2)-M(x*y)*M(x))/(M(x2)-(M(x))2)

其中M(f)表示所有fn值的算术平均值


实际上,更多的点(xn,yn)意味着更精确的线性模型。误差很大程度上取决于(M(x2)-(M(x))2)值(大的值意味着小的误差)。因此,只有当你有足够的点时,你才能应用这个公式-因此(M(x2)-(M(x))2)值大于某个极限值。

。为什么不将较粗流中的项目乘以?例如,如果它们是微秒和纳秒,则将微秒乘以1000以获得两者的单位ns?计算GCD,或使用2个线程。如果您在时间
t
,则可以通过找到下一个事件的时间de>int((t-start)/interval)*interval+start。使用音频和视频的
start
interval
,您可以计算出每个事件的下一次发生,特别是哪一次发生得更早。