web-dev-qa-db-ja.com

ffmpegはオーディオを追加しますが、ビデオの長さは同じにします(-shortestではありません)

私はffmpegを使ってビデオファイルにオーディオを追加しています

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4

ただし、これにより、ビデオよりも長い場合、出力ビデオファイルがオーディオファイルの長さに拡張されます。 -shortestを使用すると、オーディオファイルがビデオより短い場合、ビデオファイルが短くカットされます。では、ffmpegに出力ビデオの長さを入力ビデオの長さに保つようにカットするように指示するフラグはありますか?

11
stealthcopter

-filter_complexオプションとapadフィルターオプションを使用して、ビデオが長い場合、最後に無音でオーディオを埋め込むことで、目的を達成できると思います。あなたのコマンドは:

ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -shortest output.mp4

これは、必要なオーディオがaudiofile.wavの最初のストリームにあることを前提としています。[A:B]構文は、A番目の入力からB番目のストリームを取得することを示しています(どちらも0で始まるため、[1:0]は2番目の入力からの最初のストリーム、または上記のaudiofile.wav)。

詳細: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68

13
deadcode
  • ビデオの長さがオーディオの長さよりも短い場合、-shortestはあなたが欲しいものです。
  • ビデオの長さがオーディオの長さより長い場合、フラグはまったく必要ありません。

この決定を自動化するためのフラグはありません。

[〜#〜]編集[〜#〜]

@deadcodeの答えに触発されて、私は明確にする必要があります、あなたが再エンコードしたいなら、「自動化するフラグがない」はもちろん真実ではありません:この場合はapadとして@deadcodeによって提案されました。

ただし、再エンコードを避けたい場合(つまり、-c:v copy)答えはそのままです。

ffconcat demuxerを使用する回避策がありますが、少し作業が必要です。

  • オーディオファイルとまったく同じ形式で無音を含むファイルを作成します( "silence.wav")
  • 連結ファイル "audio.ffconcat"を作成します(音声が十分に長いことを確認するために必要な数の無音行を含む):

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
  • 実行ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

これにより、フィルターグラフなしでapadフィルターが合成され、再エンコードせずにマルチプレクサを使用できるようになります。

12
Eugen Rieck

ビデオファイルの長さがわかっている場合は、

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4

ここで、43は秒単位のビデオファイルの長さです。

4
Zurechtweiser