web-dev-qa-db-ja.com

ffmpeg / avconvasyncが機能していません-オーディオの同期を解除します

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秒の違いがあるかどうかはわかりません。だから私はこれを動的に管理できる解決策を探しています(欠落しているオーディオの長さのオフセットを追加してください)。

1
Khaleel

オプション-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などのストリームにタイムスタンプを持つコンテナを使用する必要があります。

5
ptQa