音频漂移问题。以编程方式创建视频帧并与 java 中的 midi/audio 同步

Audio drift issue. Creating video frames programmatically and syncing with midi/audio in java

我想创建一个改变 midi 文件音符的视频。我正在录制 midi 然后将其输出为 wav。

在java我读了midi文件,根据弹奏的音符创建图像。我正在计算音符之间的时间并使用它来确定使用此代码的帧数:

    for(int i = 0; i < noteImages.size(); i++) {
        for(int j = 0; j < frameRate * (noteLengths.get(i) / 1000); j++) {
            videoFrames.add(noteImages.get(i));
            frameCount++;
        }
    }

然后我使用 ffmpeg 使用以下命令从带音频的图像创建视频:

ffmpeg -r 60 -f image2 -i pic%05d.png -itsoffset 3 -i audio.wav -c:v libx264 -c:a aac -pix_fmt yuv420p -crf 23 -r 24 -shortest -y output.mp4 

音频开始正常,然后逐渐不同步。如果我在创建图像时使用更高的 fps,它就不那么明显了,但我至少需要使用 300fps 才能接近它,但它仍然不太正确。关于如何纠正此问题的任何想法?

除以 1000 会导致舍入错误,除非长度已经是 1000 的倍数。

您必须只在计算的最后一步舍入(这样误差总是小于一帧):

j < (frameRate * noteLengths.get(i)) / 1000

如果值可以大于 2×109,请使用 long 乘法。