ffmpeg でこのビデオを短くできないのはなぜですか?

ffmpeg でこのビデオを短くできないのはなぜですか?

ビデオの速度を2倍にしようとしています。

次のコマンドを使用します:

ffmpeg -i output.mp4 -filter:v "setpts=0.5*PTS" output2.mp4

そして

ffmpeg -i output.mp4 -vf "setpts=0.5*PTS" output3.mp4

これはインターネット上では標準的な方法だとよく見かけます。

ただし、すべてのファイルの長さは同じです。

joe@joe-Amd-Am4-Home-Office:~$ for file in *.mp4; do duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file"); echo "$file: $duration seconds"; done
output2.mp4: 373.014000 seconds
output3.mp4: 373.014000 seconds
output.mp4: 373.014000 seconds

何が起こっているのでしょうか? また、ビデオを適切に高速化するにはどうすればいいでしょうか? 私は Ubuntu を使用しています。

答え1

私の最初の推測は、文書化されたPTSアプローチがここは、「各ビデオフレームのプレゼンテーションタイムスタンプ(PTS)を変更することによって」機能します。プレイヤー尊重し、スピードを上げるだろう。しかし、おそらくそれは報告動画の長さはffprobeご覧のとおりです。

しかし、私が持っているランダムなテスト mp4 をいじってみると、ビデオは高速化されているものの、オーディオは高速化されていないことがわかります。これは、 経由で各ビデオに同じタイムスタンプが表示される理由を説明していますffprobe。これは、上記のリンク先のドキュメントの注記と一致しています。

次の例では、オーディオ ストリームは変更されないため、理想的には で無効にする必要があることに注意してください-an

もう一つの答えスーパーユーザービデオとオーディオの両方を高速化するために、次の複雑なフィルターを提供します。

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

そして、それは私にとってはうまく機能し、 を介して長さの半分を表示しますffprobe

関連情報