2017-09-06 6 views
0

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를 사용하여 이미지를 가깝게 만들어야합니다. 그래도 여전히 적합하지 않습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

+0

노트의 지속 시간은 일정합니까? – Mulvya

+0

두 가지 다른 음표 지속 기간이 있습니다. 한 유형은 다른 음표 지속 기간의 두 배입니다. 하나는 666.667ms이고 더 긴 것들은 1333.334ms입니다 – user6688986

답변

1

길이 이미 (오류가 미만 프레임 항상되도록)에만 계산의 마지막 단계에서 반올림한다 1000

의 배수가 아니라면 반올림 오류로 이어질 것입니다 1000 분할 :

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

값이 될 경우 10 × 9 보다 큰 2는 long 승산을 사용한다.

+0

고맙습니다. int로 변환하지 않는 실수를했습니다. 결과가 40.01이라면 여분의 프레임이 추가되었을 것입니다. – user6688986