2017-09-06 3 views
0

midiファイルのノートに変更するビデオを作成したいとします。私はmidiを録音してwavとして出力しています。オーディオドリフトの問題。プログラムでビデオフレームを作成し、JavaでMIDI /オーディオと同期する

私は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

2つの異なる音符の長さがあり、一方は他方の長さの2倍です。 1つは666.667ms、長いものは1333.334msです – user6688986

答えて

1

長が既に(エラーが1つの未満のフレームは常にあるように)あなたが唯一の計算の最後のステップで丸める必要があります1000

の倍数でない限り、丸め誤差につながる1000で割ます:

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

値は、2×10 9 より大きくなるlong乗算を使用できる場合。

+0

ありがとう、これは働いた。私はintに変換しないというミスを犯しました。その結果が40.01だった場合は余分なフレームが追加されます。 – user6688986

関連する問題