動画ファイルを綺麗に軽量化するコマンドライン



扱っている 動画ファイルが大きい。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

https://www.google.com/search?q=sample+avi&lr=lang_ja

  • 結果

    • 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



いいなと思ったら応援しよう!