我想创建一个更改为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来使它接近它仍然不太正确。关于如何纠正这个问题的任何想法?
答案 0 :(得分:1)
除非长度已经是1000的倍数,否则除以1000将导致舍入误差。
您必须仅在计算的最后一步进行舍入(以便错误始终小于一帧):
j < (frameRate * noteLengths.get(i)) / 1000
如果值可能大于2×10 9 ,请使用long
乘法。