とても久々の投稿!
最近は忙しかったり、
変な事で忙しかったり、
志事で忙しかったりしていました。
そんな中
あるフォルダ内に大量に集めた動画を変換しようと思い・・・
見ると、大量も大量・・・・・
これをポチポチ設定して書き出すのは面倒・・・・
Handbrakeでやっても
変換したいファイルを切り替えてはバッチに入れてと
繰り返し繰り返していかなければならない・・・・・
やはり・・・・・
面倒・・・・・
これはffmpegしかない!
という事で
掲題の件!
某フォルダ内に沢山ある
「縦型のmp4」の内容(私情も含む)
1・[1080x1920]~[1080x2048]などある
2・[~30fps]まである
3・ビットレートはまちまちで所々見たところ6.3Mbps以下
(4・Handbrakeでポチポチするのが面倒)
(5・こんな時は強力な味方!ffmpegしかない!)
という事で、それをffmpegで
a・全て1080x1920にする(縦動画)
b・24フレーム(CFR)
c・ビットレート指定6.5Mbps
(3が6.4Mbpsや6.5Mbpsがあった場合のために6.5Mbps指定)
d・元の動画と同じファイル名
e・指定の別フォルダに書き出す
という形でエンコードしようと考えました
どうすれば良いかと辿り着いたコマンド。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
input_folder=“<変換したいmp4の入ったフォルダのパス>”
output_folder="<変換したmp4の保存先のフォルダのパス>"
mkdir -p "$output_folder" # 出力先フォルダが存在しない場合は作成
for file in "$input_folder"/*.mp4; do
filename=$(basename "$file")
output_file="$output_folder/${filename%.*}.mp4"
ffmpeg -i "$file" -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" -r 24 -b:v 6.5M -c:a copy "$output_file"
done
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
というコマンド。
(これは下記(ずっと下の方)で使うので、※1とします)
こちらはターミナルに貼り付けると自動で動き出します。
フォルダのパスは、Macをお使いの方は
指定のフォルダを右クリックorコントロール押して
オプションキーを押すと、コピーの部分がパスをコピーに変わるので
そこから取得できます。
Windowsの方は
ファイルを選択してエクスプローラーの「パスのコピー」
ファイルを「Shift+右クリック」して「パスのコピー」
などがあります。
それぞれのフォルダのパスを
<変換したいmp4の入ったフォルダのパス>
<変換したmp4の保存先のフォルダのパス>
ここに貼り付けると完成です。
因みにコマンドの意味は以下になります。
input_folder=“<変換したいmp4の入ったフォルダのパス>”:
入力ファイルが格納されているフォルダのパスを指定します。この変数は後で使用されます。
output_folder="<変換したmp4の保存先のフォルダのパス>":
出力ファイルを保存するフォルダのパスを指定します。この変数も後で使用されます。
mkdir -p "$output_folder":
出力フォルダが存在しない場合に、そのフォルダを作成します。-pオプションは、必要に応じて親ディレクトリも作成します。
for file in "$input_folder"/*.mp4; do:
入力フォルダ内のすべての.mp4ファイルに対してループを開始します。
filename=$(basename "$file"):
ファイルパスからファイル名のみを取得します。
output_file="$output_folder/${filename%.*}.mp4":
出力ファイルのパスを指定します。
${filename%.*}
はファイル名から拡張子を取り除くための構文です。
ffmpeg -i "$file" -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" -r 24 -b:v 6.5M -c:a copy "$output_file":
FFmpegコマンドを使用して、入力ファイルを指定された条件で変換します。
-i "$file":
入力ファイルを指定します。
$fileはループ内で処理される各入力ファイルのパスです。
-vfオプションは
ビデオフィルタを指定し、ここでは解像度の変更とパディングを行っています。
-rオプションは
出力のフレームレートを指定し、
-b:vオプションは
ビデオのビットレートを指定します。
-c:a copyは
オーディオストリームをコピーすることを指定します。
"$output_file"は
出力ファイルのパスです。
done:
ファイルのループ処理を終了します。
これで、指定したフォルダの中に求めていたmp4が書き出せます!
書き出しお疲れ様でした!
因みに・・・・・
時間を掛けて綺麗にエンコードをしたい!
という場合には以下
(時間が掛かりますので、注意してください)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
input_folder=“<変換したいmp4の入ったフォルダのパス>”
output_folder="<変換したmp4の保存先のフォルダのパス>"
mkdir -p "$output_folder" # 出力先フォルダが存在しない場合は作成
for file in "$input_folder"/*.mp4; do
filename=$(basename "$file")
output_file="$output_folder/${filename%.*}.mp4"
ffmpeg -i "$file" -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" -r 24 -c:v libx264 -preset veryslow -crf 18 -b:v 6.5M -c:a copy "$output_file"
done
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ここではマーカーをつけた部分
-preset veryslow
を使用して丁寧に書き出します。
(こちらは※2とします)
先に述べましたように
時間がかかったりします。
その理由位は以下になります。
書き出されたファイルのサイズは小さくなったりもしますが
CABAC(Context Adaptive Binary Arithmetic Coding)=
データの圧縮効率を向上させるために使用されます。
リファレンスフレームは多くなります。
リファレンスフレームとは、動きの予測に使用されるフレームのことです。
具体的には、予測のために参照される基準となるフレームのことです。
一般的に、前方予測や後方予測のために、1つまたは複数のリファレンスフレームが使用され
これらのリファレンスフレームは、
符号化された動画データの中で特別な位置を持ち、デコード時に必要になります。
CABAC(Context Adaptive Binary Arithmetic Coding)は
H.264およびHEVC(H.265)といった動画コーデックで使用される符号化技術の一種。
CABACは、データの圧縮効率を向上させるために使用され
符号化するデータの周囲の文脈に基づいて、各ビットの確率を動的に調整します。
例えばこういった感じの場合
書き出し前
・CABAC / 5 Ref Frames (サイズ3.2MB)
書き出し後①
・CABAC / 4 Ref Frames (サイズ9.1MB)(※1で書き出したファイル)
書き出し後②
・CABAC / 16 Ref Frames (サイズ3.2MB)(※2で書き出したファイル)
(ビットレートの差が大きいですね)
・CABAC / 5 Ref Frames
・CABAC / 4 Ref Frames
・CABAC / 16 Ref Frames
だけで見れば、違いはリファレンスフレームの数。
そして、※1よりも※2の方がファイルサイズが小さいですね。
リファレンスフレームの数が多いほど符号化とデコードの品質が向上しますが
処理にはより多くのリソースが必要になります。
同時により多くのリファレンスフレームを使用する方が
動きの滑らかさや品質の向上に役立ちますが
エンコードやデコードにはより多くの計算リソースが必要になります。
そのため、使用するフレーム数は、目的や環境に応じて選択する必要があります。
つまり
動画の品質や圧縮効率が向上します。
しかし、リファレンスフレームを増やすと、エンコードやデコードに必要な計算量が増加し、
基本的に処理に時間がかかります。
そのため、リファレンスフレームの数を適切に調整することが重要です。
こんな話をしていると、1つのことが浮かんできますね・・・
そうここで1つの問題
気になっている人がいるであろう問題
30fpsのものを24fpsにすれば
フレーム数が減って映像がカクカクするでしょ!
というお話
もちろん、カクカクしますね。
24fps→30fpsにしてフリーズフレームが増えるよりは良いでしょう。
気にしない人も多くいることと思います。
しかし!
気になる人にとっては気になって仕方がない問題。
そんなあなたに朗報です!
動き補正・動き補完を取り入れたコマンドを準備してあります!
気が利いて仕方がない私に自画自賛。
1つ言っておきます!
承知のことと存じますが、
時間が半端じゃなく掛かります!!!!!!!!!
しかし、こだわりのあなたのために準備しました!
そのコマンドは以下になります!
(時間が半端じゃなく掛かります!!!!!!!!!)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
input_folder=“<変換したいmp4の入ったフォルダのパス>”
output_folder="<変換したmp4の保存先のフォルダのパス>"
mkdir -p "$output_folder" # 出力先フォルダが存在しない場合は作成
for file in "$input_folder"/*.mp4; do
filename=$(basename "$file")
output_file="$output_folder/${filename%.*}.mp4"
ffmpeg -i "$file" -vf "minterpolate='fps=24:mi_mode=mci:mc_mode=aobmc:me_mode=bidir:me=umh'" -c:v libx264 -preset veryslow -crf 18 -b:v 6.5M -c:a copy "$output_file"
done
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
コマンドの説明をします。
このコマンドでは
minterpolate
フィルターを使用して動き補正と動き補完を有効にし
fps=24
を指定して目標のフレームレートを設定しています。
mi_mode
、mc_mode
、me_mode
などのオプションは、
動き補正と動き補完のアルゴリズムを制御します。
詳細は以下になります。
mi_mode=mci:
動き補間のモーション補間モードを指定します。
ここではMCI(Motion Compensation Interpolation)を使用しています。
mc_mode=aobmc:
モーション補間のモーションコンパンセーションモードを指定します。
ここではAOBMC(Adaptive Overlapped Block Motion Compensation)を使用しています。
me_mode=bidir:
モーション推定のモードを指定します。
ここではBidirectional(双方向)を使用しています。
me=umh:
モーション推定アルゴリズムを指定します。
ここではUMH(Uneven Multi-Hexagon)を使用しています。
そして
-preset veryslow
時間を掛けるんです!
ffmpegで動き補正・補完ができるのです!
書き出した後に、動きの滑らかさに感動することでしょう。
あなたのお役に立てて良かったです!
しかし、これでは1080x1920で書き出すことはできません。
変換したい動画の元の解像度のまま書き出されます。
動き補正・補完で1080x1920で書き出したい!
これまでに多くの時間を使って疲れ切ったので実験はしていません笑
が!
うまくいくことでしょう!
そんなコマンドは以下!
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
input_folder=“<変換したいmp4の入ったフォルダのパス>”
output_folder="<変換したmp4の保存先のフォルダのパス>"
mkdir -p "$output_folder" # 出力先フォルダが存在しない場合は作成
for file in "$input_folder"/*.mp4; do
filename=$(basename "$file")
output_file="$output_folder/${filename%.*}.mp4"
ffmpeg -i "$file" -vf "scale=1080:1980:force_original_aspect_ratio=decrease,crop=1080:1980" -r 24 -c:v libx264 -preset veryslow -crf 18 -b:v 6.5M -c:a copy "$output_file"
done
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
このコマンドの説明をしますが
長くなります・・・・・
(元気がある方が読んでください)
ffmpeg: FFmpegコマンドの実行を開始します。
-i "$file": 入力ファイルを指定します。$fileはループ内で処理される各入力ファイルのパスです。
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2, minterpolate='fps=24:mi_mode=mci:mc_mode=aobmc:me_mode=bidir:me=umh:mc=bf:vsbmc=1:mb_size=16:search_param=400:scd=fdiff:fps=120'": ビデオフィルタを指定します。scaleフィルタは、入力映像を指定された解像度にスケーリングします。padフィルタは、解像度を1080x1920に拡張し、映像を中央に配置します。minterpolateフィルタは、動き補正と動き補完を行います。詳細は後述します。
-c:v libx264: 動画エンコーダーを指定します。ここではlibx264(H.264コーデック)を使用しています。
-preset veryslow: エンコード速度を設定します。veryslowは非常に高品質な設定で、エンコード時間がかかりますが、品質が向上します。
-crf 18: CRF(Constant Rate Factor)値を指定します。値が低いほど高品質な動画が得られます。
-b:v 6.5M: ビットレートを指定します。ここでは6.5 Mbpsに設定しています。
-c:a copy: オーディオストリームをコピーします。ビデオとオーディオを同時に変換する必要がない場合は、オーディオストリームをコピーしてエンコード時間を短縮します。
"$output_file": 出力ファイルを指定します。$output_fileはループ内で処理される各出力ファイルのパスです。
minterpolateフィルタのオプションは以下の通りです:
fps=24: 出力フレームレートを指定します。ここでは24fpsに設定しています。
mi_mode=mci: 動き補間のモーション補間モードを指定します。ここではMCI(Motion Compensation Interpolation)を使用しています。
mc_mode=aobmc: モーション補間のモーションコンパンセーションモードを指定します。ここではAOBMC(Adaptive Overlapped Block Motion Compensation)を使用しています。
me_mode=bidir: モーション推定のモードを指定します。ここではBidirectional(双方向)を使用しています。
me=umh: モーション推定アルゴリズムを指定します。ここではUMH(Uneven Multi-Hexagon)を使用しています。
mc=bf: モーション補間のモーションコンパンセーションタイプを指定します。ここではBF(Bidirectional Frames)を使用しています。
vsbmc=1: Very Slow Bidirectional Motion Compensationを有効にします。
mb_size=16: マクロブロックのサイズを指定します。
search_param=400: モーション推定の探索パラメータを指定します。
scd=fdiff: Scene Change Detection(シーン変更検出)を指定します。
fps=120: モーション補完のフレームレートを指定します。ここでは120fpsに設定しています。
はい、このような感じになっています。
fps=120
は、動画を補完するためにフレーム数を増やすために使用されますので
必要に応じて、これらのオプションを調整して最適な結果を得ることができます。
色々と、変更して納得のいくエンコードをしてくれればと思います!
以上になります!
誰かの参考になれば嬉しく思います!
それでは!