我会尽力描述我的问题。我有两个列表,一个带有音频帧,另一个带有彩色帧(不相关)。它们都有时间戳,它们是在同一时刻但在不同时刻被捕获的。所以,我喜欢这个:
index COLOR AUDIO
0 841 846
1 873 897
2 905 948
3 940 1000
... ... ...
框架以高数字开始,因为它们被捕获然后被修剪到特定部分,但即时拍摄,第0帧同步仅相隔5ms(时间戳以毫秒为单位)。
在每种情况下,音频帧数都小于颜色数。我需要让它们具有相同的数量。起始帧可以是颜色>音频,颜色
编辑: 我在每个列表上有超过4帧。 帧之间的时间不是恒定的。
EDIT2: 这是使用kinect捕获的,虽然我认为它无关紧要,我无法再次捕获数据
edit3:有人问为什么我需要同步时间。我正在使用它来开发一个多模态情感识别系统,我需要训练一个决策级别分类器(KNN),所以我需要两个分类器上的输入数据来及时匹配相同的时间。我不能在我没有的帧上提供“零”数据。
EDIT4:试图描述我的问题以及我想要做得更好的事情: 我有两个框架列表,音频和颜色。它们都对应于相同长度的录音,例如,它们都“描述”5s的录音。 问题是,我的音频样本比我的颜色样本少(因为采样率)。现在,我需要在Multimodal分类器上输入这些帧,音频和颜色。 thinf,我需要知道哪个颜色帧对应于音频帧,以便我可以将它们作为“单帧”发送到分类器进行分类。我不能这样做,因为我不知道列表音频的哪个索引对应于列表颜色上的另一个索引(反之亦然)。所以我要做的是将较小的列表(音频)扩展为与较大列表(颜色)相同的计数。要做到这一点,我需要复制一些音频帧。我的问题是解决这个问题,我怎么知道哪个帧最好被复制?我有时间戳,但我无法对algortihm进行自动排序。
答案 0 :(得分:1)
我相信你可以将音频帧对齐到最接近(时间)的颜色框架。
void align(long[] colorTimes, ColorFrame[] colorFrames,
long[] audioTimes, AudioFrame[] audioFrames)
{
assert colorTimes.length == colorFrames.length;
assert audioTimes.length == audioFrames.length;
assert audioTimes.length <= colorTimes.length;
// We assume all times and frames are sorted.
// Otherwise you can sort them here.
int lastAlignedColorIndex = -1;
for (int index = 0; index < audioTimes.length; index++) {
int timeToAlign = audioTimes[index];
int alignedIndex = lastAlignedColorIndex + 1;
int colorIndex = lastAlignedColorIndex + 2;
while (colorIndex < colorTimes.length) {
if (colorTimes[alignedIndex] > timeToAlign)
break;
int timeDiff = Math.abs(colorTimes[colorIndex] - timeToAlign);
if (timeDiff < Math.abs(colorTimes[alignedIndex] - timeToAlign))
alignedIndex = colorIndex;
colorIndex++;
}
enterData(colorFrames[alignedIndex], audioFrames[index]);
lastAlignedColorIndex = alignedIndex;
}
}