音频漂移问题。以编程方式创建视频帧并与 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
乘法。
我想创建一个改变 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
乘法。