音频漂移问题。以编程方式创建视频帧并与java中的midi /音频同步
问题描述:
我想创建一个视频,以更改MIDI文件中的音符。我正在录制MIDI,然后将其输出为wav。音频漂移问题。以编程方式创建视频帧并与java中的midi /音频同步
在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×10 9 ,使用long
乘法。
+0
谢谢,这个工作。我犯了一个不转换为int的错误,所以如果结果是40.01,它会增加一个额外的帧。 – user6688986
您的笔记持续时间统一吗? – Mulvya
有两种不同的音符持续时间,一种是另一种音符持续时间的两倍。一个是666.667ms,较长的是1333.334ms – user6688986