Webカメラからのビデオをwebmとして記録し、マイクからのオーディオをwavとして記録するJavaScriptがあります。私はこれらのwebmファイルとwaveファイルをエンコードして、ffmpeg/avconvを使用してmp4ファイルを生成しています。しかし、オーディオの長さとビデオの長さがわずかに異なり、出力が同期していないことに気づきました。
Async/asynctsオプションを試しましたが、出力に違いがなく、同期が取れていないことに気づきました。
ffmpeg -async 1 -y -i audio.wav -i video.webm -vcodec libx264 output.mp4
Avconvでareasampleフィルターを使用してみましたがエラーが発生しました
No such filter: 'areasample'
Error opening filters!
for
avconv -y -i audio.wav -i video.webm -vcodec libx264 -filter "areasample=asyncts:compensate" output.mp4
ビデオを同期させるにはどうすればよいですか?
更新:
私のオーディオの長さはビデオの長さよりも短いです。コマンドffmpeg -itsoffset -00:00:01 -y -i audio.wav -i video.webm -vcodec libx264 output.mp4
を使用して同期させています。しかし、常に1秒の違いがあるかどうかはわかりません。だから私はこれを動的に管理できる解決策を探しています(欠落しているオーディオの長さのオフセットを追加してください)。
オプション-asyncは、オーディオストリームとビデオストリームにタイムスタンプがある場合にのみ役立ちます。私はあなたがそれを持っているとは思わない。そのため、出力に違いは見られません。
したがって、おそらくあなたの問題は、ビデオとオーディオの長さと開始時間が異なることです。その場合は、オーディオまたはビデオストリームをトリミングする必要があります(オーディオまたはビデオの長さが長いかどうかによって異なります)。
どちらが長いか、何が同期していないかを秒単位で指定していません。だから私は例を挙げました。 0.5秒早くオーディオがあると仮定しましょう。次に、実行する必要があります。
ffmpeg -i audio.wav -af "atrim=start=0.5" -i video.webm -vcodec libx264 output.mp4
P.S. gitからffmpegを使用するか、OSの最新パッケージを見つけてください。
更新: Ffmpegには、ビデオフレームと同時に表示するオーディオパッケージに関する情報がありません。 wavではなくmpegtsなどのストリームにタイムスタンプを持つコンテナを使用する必要があります。