動画ファイルを綺麗に軽量化するコマンドライン
扱っている 動画ファイルが大きい。1コマンドラインで小さくしたい?
そんな時のためにシェルスクリプトを作りやした。
0. 最終結果
ファイル名(任意): video_encode_to_mp4.sh
#!/bin/sh
set -eux
INPUT_FILENAME="${1}"
OUTPUT_FILENAME="${INPUT_FILENAME%.*}.mp4" # 任意の拡張子を .mp4 に変更
THREADS=$(sysctl -n hw.ncpu | awk '{printf "%d", $1/2}')
START_TIME=$(date +%s) # エンコード時間表示のため
nice -n 19 ffmpeg -y -i "${INPUT_FILENAME}" \
-vf "yadif=mode=1:parity=auto:deint=1" \
-c:v libx265 -preset medium \
-x265-params "pools=${THREADS}:crf=28" \
-c:a aac -b:a 192k \
-tag:v hvc1 \
-movflags +faststart "${OUTPUT_FILENAME}"
# エンコード時間表示のため
(END_TIME=$(date +%s); DURATION=$((END_TIME-START_TIME)); printf "所要時間: %dh %02dm %02ds\n" $((DURATION/3600)) $((DURATION%3600/60)) $((DURATION%60))) >&2 # 時間表示
※
- Unix系システムでは互換性があるように作っています、Linux/Mac向けです。winは考慮していません。
- 画質の設定部分は"crf=28"。コンテンツ内容など必要に応じて要調整 (低いほど高画質/H.265のデフォルトは28)
実行コマンドライン
sh '~/scripts/video_encode_to_mp4.sh' child.avi
結果
avi 1.9MB → mp4 467KB
Qavg: 62686.836
++ date +%s
+ END_TIME=1735052956
+ DURATION=1
+ printf '所要時間: %dh %02dm %02ds\n' 0 0 1
所要時間: 0h 00m 01s
以下解説~
シェルスクリプトの解説
このシェルスクリプトは、動画ファイルをH.265/HEVCコーデックを使用してMP4形式に変換するためのものです。以下、各部分を詳しく解説します。
1. シバンと基本設定
#!/bin/sh
set -eux
`#!/bin/sh`: シェルスクリプトをshシェルで実行することを指定
`set -eux`: 以下のシェルオプションを設定
`e`: エラー発生時にスクリプトを終了
`u`: 未定義変数参照時にエラー
`x`: 実行コマンドを表示(デバッグ用)
2. 変数の設定
INPUT_FILENAME="${1}"
OUTPUT_FILENAME="${INPUT_FILENAME%.*}.mp4"
THREADS=$(sysctl -n hw.ncpu | awk '{printf "%d", $1/2}')
START_TIME=$(date +%s)
`INPUT_FILENAME`: 第1引数を入力ファイル名として設定
`OUTPUT_FILENAME`: 入力ファイルの拡張子を.mp4に変更
`THREADS`: CPUコア数の半分をスレッド数として設定
`START_TIME`: エンコード開始時刻を記録
3. FFmpegによる動画エンコード
nice -n 19 ffmpeg -y -i "${INPUT_FILENAME}" \
-vf "yadif=mode=1:parity=auto:deint=1" \
-c:v libx265 -preset medium \
-x265-params "pools=${THREADS}:crf=30:level-idc=41" \
-c:a aac -b:a 192k \
-tag:v hvc1 \
-movflags +faststart "${OUTPUT_FILENAME}"
`nice -n 19`: 最低優先度でプロセスを実行
FFmpegのオプション:
`-vf "yadif=mode=1:parity=auto:deint=1"`: インターレース解除
`-c:v libx265`: H.265/HEVCコーデックを使用
`-preset medium`: エンコード速度と品質のバランスを設定
`-x265-params`: H.265エンコーダーのパラメータ設定
`-c:a aac -b:a 192k`: 音声をAAC 192kbpsでエンコード
`-tag:v hvc1`: Apple機器との互換性のためのタグ設定
`-movflags +faststart`: ストリーミング再生に最適化
- H.265をコーデックを使わないと、まともにファイルサイズを小さくできません。デファクトスタンダードです
- 元の動画がインターレースであれば、解除しておいた方が良いでしょう
4. エンコード時間の計算と表示
# エンコード時間表示のため
(END_TIME=$(date +%s); DURATION=$((END_TIME-START_TIME)); printf "所要時間: %dh %02dm %02ds\n" $((DURATION/3600)) $((DURATION%3600/60)) $((DURATION%60))) >&2 # 時間表示
エンコード開始時刻と終了時刻の差から所要時間を計算
時間、分、秒の形式で標準エラー出力に表示
このスクリプトは、高品質な圧縮と互換性を両立させながら、動画ファイルをMP4形式に変換する機能を提供します。
必要なもの
FFmpeg
macでのインストール方法は以下です
brew install ffmpeg