Gemcook Tech Blog
📼

PRに貼る動画を軽くしてレビューを少しだけ快適にする

に公開

はじめに

GitHubでPRを出す時にエビデンスとして動画を貼ることがあると思います。

その時に添付されている動画が重すぎたり、再生するまでに時間がかかったり、途中で再生が止まったりしたことはないでしょうか?

何か対策できないかな?と思い、動画の軽量化をしてから添付するようにしていました。

この「PR動画軽量化」の話を社内でしたら意外と好評だったので、僕自身が使っている動画を軽量化するときのスクリプトを共有したいと思います。(体感、5秒の待ち時間が1秒くらいになった気がします)

今回作成するもの

前提知識

そもそも動画ファイルとは

動画ファイルとは「映像データ」+「音声データ」+「メタ情報」を、ひとまとめにして扱うための「コンテナ」を指しており、代表的なコンテナの形式として MP4 であったり MOV などがあげられます。

動画とは 「ケース(箱)」の中に、映像データと音声データがそれぞれ別の方式で圧縮されて入っている とイメージすると分かりやすいかもしれません。

  • ケース(箱) → MP4 や MOV などの「コンテナ形式」が格納・管理する
  • 映像データ → H.264 などの「映像コーデック」で圧縮
  • 音声データ → AAC などの「音声コーデック」で圧縮

そもそも動画を軽くするとは何か?

「動画を軽くする」というと ファイルサイズを小さくすること だけのように聞こえますが、実際にはもう少し細かく捉える必要があります。 動画は、以下の複数の要素を調整し、それらをどう組み合わせ、どこまで画質を削って良いか を判断することで軽量化できます。

  • フレームレートを下げる
  • 解像度を下げる
  • ビットレートを下げる
  • コーデックの選択(より効率的な圧縮方式を使う)

PR で共有する短い比較動画であれば、視認性が確保できていれば十分で、高画質を維持する必要はありません。一方、プロモーション用途や大画面での再生が前提の場合は、圧縮しすぎると見た目のクオリティが大きく損なわれてしまいます。

ffmpegを使う

ffmpegとは?

ffmpeg は、動画・音声の変換や編集に利用されるコマンドラインツールです。 形式変換、圧縮、トリミング、結合といった多様な操作が可能で、前述した「動画を軽くする」ための各手段もターミナルから直接編集・書き出しできます。

ffmpegで使用する主なプロパティ

動画を軽くする際に調整する代表的なパラメータは以下のとおりです。

  • vcodec(コーデック)libx264 が一般的で扱いやすい
  • CRF(品質調整):数値が高いほどファイルは軽くなるが画質が下がる(目安は 18〜30)
  • preset(変換速度)ultrafastveryslow。遅いほど高圧縮になり品質が上がるが処理が重い

変換コマンド例

# -i 入力ファイル
# -vcodec 使用するコーデックを指定
# -crf 品質調整値(高いほど軽い)
# -preset 変換速度(遅いほど高品質・高圧縮)
ffmpeg -i "入力ファイル.mov" -vcodec libx264 -crf 23 -preset veryfast "出力ファイル.mp4"

キャプチャから変換までの自動化

ffmpeg のコマンドを毎回手入力するのは手間がかかります。そこで、動画ファイルを指定するだけで自動的に軽量化してくれるスクリプトをあらかじめ用意しておくと便利です。

shell scriptとは?

shell script(シェルスクリプト)とは、ターミナルで実行する複数のコマンドをまとめて自動化できる仕組みです。ffmpeg のように毎回同じ形式でコマンドを実行するケースでは、作業の効率化に特に役立ちます。

https://qiita.com/osw_nuco/items/a5d7173c1e443030875f

実際に shell script を作成してみよう

変換用のファイルを作成し、その中に以下の compressed.command を配置します。このスクリプトは、同じディレクトリにある .mov 形式のファイルをすべて取得し、一括で .mp4 に変換してくれます。

compressed.command
#!/bin/sh

# このスクリプトが置かれているディレクトリに移動
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR" || exit 1

# カレントディレクトリ内の .mov をすべて対象にする
for INPUT in ./*.mov; do
  # .mov ファイルが存在しない場合はループを終了
  [ -e "$INPUT" ] || break

  BASENAME="$(basename "$INPUT")"
  NAME="${BASENAME%.*}"
  OUTPUT="${NAME}.mp4"

  echo "変換中: $INPUT -> $OUTPUT"

  ffmpeg -i "$INPUT" \
    -vcodec libx264 \
    -acodec aac \
    -crf 23 \
    -preset veryfast \
    "$OUTPUT"

  echo "完了: $OUTPUT"
done

echo "すべての .mov の変換が終了しました。"

ターミナルで以下のコマンドを実行して、実行権限(chmod)を付与してください。

chmod +x compressed.command

まとめ

ffmpeg と shell script を使うとフローを自動化することができて、毎回の手作業を大幅に削減できるので良いですね。
PRだけではなく、Slackなど動画を誰かと共有することが多い時は使ってみてください!

Gemcook Tech Blog
Gemcook Tech Blog

Discussion