ffmpegで動画を圧縮する
普通にmp4に変換すれば圧縮される
$ ffmpeg -i input.avi output.mp4
1から51まで
encodingによってdefault valueが変わる
$ ffmpeg.exe -i input.mp4 -c:a copy -c:v libsvtav1 -preset 5 -svtav1-params tune=0 output.mp4
$ ffmpeg.exe -i input.mp4 -map_metadata 0 -movflags +use_metadata_tags -c:a copy -c:v libsvtav1 -preset 5 -svtav1-params tune=0 output.mp4
$ ffmpeg -i input.mp4 -c:a copy -c:v libx265 -crf 22 output.mp4
defaultは-crf 28
22にしたほうが画質がいいらしいが、正直違いはわからないtakker.icon
decoderもhardwareでやりたい場合は、-hwaccel qsvと-hwaccel_output_format qsvもいれる
また、hardware encoderを使うときは-crfではなく-presetと-global_qualityを使う
どちらの要素が強いのかはわからない
$ ffmpeg -i input.mp4 -strict -2 -c:a copy -c:v libaom-av1 output.mkv
AV1は実験用フラグ-strict -2を立てないと使えない
めちゃくちゃ遅いので覚悟すること
2020年1月現在、リファレンス実装であるlibaomのエンコード速度が非現実的(x264の数千倍)なまでに低速であることが欠点とされる。エンコードの高速化を目標としたオープンソースのrav1eや、IntelがXeon CPU向けに開発しているSVT-AV1などの実装などが存在しているが、いずれれにせよエンコードにはx264やx265(英語版)の数倍~数十倍程度の時間がかかり、非常に低速である。 あまりにも遅すぎるので非推奨
2023-06-15 08:17:56 ffmpeg 6.0からav1_qsvを使えるようになった メタデータを維持して変換するには、-map_metadataを使う
一旦すべてのメタデータをmetadata.txtに出力する
$ ffmpeg -i input.mp4 -map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -f ffmetadata metadata.txt
metadata.txtの情報を出力先ファイルに書き込む
$ ffmpeg -i input.mp4 -f ffmetadata -i metadata.txt -map_metadata 1 -movflags +use_metadata_tags -c copy output.mp4
-movflags +use_metadata_tags: 任意のmetadata(com.android.versionなど)も付与する
ある程度のmetadataなら、ファイルを介さずとも-map_metadata 0 -movflags +use_metadata_tagsを加えるだけですべてコピーされるみたい