0

我会尽力描述我的问题。我有两个列表,一个带有音频帧,另一个带有彩色帧(不相关)。它们都有时间戳,它们是在同一时刻被捕获的,但在不同的时刻。所以,我有这样的:

index  COLOR  AUDIO
0      841    846
1      873    897
2      905    948
3      940    1000
...     ...    ...

帧以高数字开始,因为它们被捕获然后修剪到特定部分,但我拍摄,帧 0 仅以 5ms 的间隔同步(时间戳以 ms 为单位)。

在我遇到的每种情况下,音频帧数都小于颜色数。我需要使它们具有相同的计数。陈述帧可能是颜色>音频,颜色

编辑:我在每个列表中有超过 4 帧。帧之间的时间不是恒定的。

edit2:这是使用 kinect 捕获的,虽然我认为它无关紧要,但我无法再次捕获数据

edit3:有人问我为什么需要同步时间。我正在使用它来开发一个多模态情感识别系统,我需要训练一个决策级分类器(KNN),所以我需要两个分类器上的输入数据及时匹配相同的时刻。我无法在我没有的框架上提供“零”数据。

EDIT4:试图描述我的问题以及我想做的更好的事情:我有两个帧列表,音频和颜色。它们都对应于相同长度的录音,例如,它们都“描述”了 5s 的录音。问题是,我的音频样本比我拥有的颜色样本少(因为采样率)。现在,我需要在多模式分类器上输入这些帧、音频和颜色。最重要的是,我需要知道哪个颜色帧对应于音频帧,以便我可以将它们作为“单帧”发送到分类器进行分类。我不能这样做,因为我不知道列表音频的哪个索引对应于列表颜色上的另一个索引(反之亦然)。所以我想要做的是将较小的列表(音频)扩展到与较大的列表(颜色)相同的数量。为此,我需要复制一些音频帧。我的问题是解决这个问题,我怎么知道哪个框架最适合复制?我有时间戳,但我无法对算法进行排序以自动执行此操作。

4

1 回答 1

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;
    }
}
于 2013-10-24T16:07:15.177 回答