
動画圧縮する方法とは?コマンドラインで楽々できる圧縮法をやさしく解説!
こんにちは、フロントエンドエンジニアの坂本です。
今から書くのは社内のチーム用に書いていたwikiなんですが、こういうことはもっと広めていった方が、みんな幸せになると思ったので、珍しく実用的な内容についてまとめたいと思います。
ズバリ!
『動画圧縮をコマンドラインから楽々やっちゃう講座!』
近年Web上で動画を扱うコンテンツの増加により、
「日々の業務で動画の容量圧縮を迫られるシーンが増えてきた。」と感じている、あなたのためにまとめました。
この記事を読めば、画質を(ほとんど)落とさずに(or Webで許容できるクオリティで)楽々動画圧縮ライフが手に入ります。
説明はmac & コマンドライン(いわゆる黒い画面。winならコマンドプロンプト、macならターミナル)の基本操作ができる前提で進めさせていただきます。
※ winの方はツールのインストール方法の説明がややこしいので、申し訳ないんですがその部分雑に説明します。インストール方法以外は多分一緒です。
※ コマンドラインの使用に免疫のない方は、申し訳ないんですが、基本操作スキルをこことかで修得してきてください。すいませんお願いします。
動画圧縮でどのくらい軽くなる?
サンプルなので、みんながみんな同じように等しく圧縮されるわけではないんですが、このくらいは軽く圧縮されます。
※ サンプルはiPhoneで撮った草津温泉の湯もみ風景です。(FHD,50秒)
※ 画像は一部を解像度そのままでクリッピングして表示しています。
1_yumomi.mov
が元のデータ [96.5MB]
2_yumomi_kantan.mp4
が手っ取り早い方法で圧縮したもの [46.5MB]
3_tumomi_honki.mp4
が本気で圧縮したもの(上手にすると綺麗に軽く圧縮できる) [43.9MB]
ちなみに、画質を諦めればもっと容量は軽くなります。(当たり前ですが)
使用するツールとは?
ffmpeg というオープンソースのツールを使用します。
GUIではなくCUI(いわゆる黒い画面で動く)のソフトです。前述した通りコマンドラインで動きます。
無料のソフトながら動画・音声の変換(数多くの形式に対応している)から、動画・音声の合成や抽出までできる優秀なやつなんです。
GUI版もなんだか出てるらしいんですが、今回は触りません。ググったらいっぱい出てきます。あとwindowsだと豊富にあるみたい。
ffmpegをインストール
macの場合Homebrewが入っている場合は、以下コマンドで一発インストールができます!
brew install ffmpeg
「Homebrew?」という方は、まず下記コマンドでhomebrewが入っているか確認してください。
brew -v # ※ Homebrewが入っている場合は "Homebre 1.3.5" とか出ます。
入ってなかった場合は下記のコマンドでインストールしてください。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
一応公式ドキュメントはこちらです。
そしてffmpegのインストールができたら一応下記コマンドで、ffmpegのインストールが完了したか確認をお願いします。
ffmpeg -version # ※ インストール完了していましたら、 "ffmpeg version 3.3.4 ...."みたいなことが出ます。
windowsの場合
windowsの方はこちらからダウンロードしたのち、パスを通してどこでもffmpegが使える状態にしてあげてください。
※ パス通す作業は、説明がなんとも面倒なので、調べるなどしてください。すいません。
動画の圧縮方法
やっと、圧縮方法説明。
動画のあるディレクトリに移動してから、コマンドを打っていきます。
圧縮方法は2パターン説明していきます。
その1「そんなに重くないけど、一応軽くしとくか…。」のとき
CBRと言われるエンコード形式(Constant Bit Rateの略)早いけど、全体で同じクオリティ(画質)でレンダリングするので、場合によっては、もっと圧縮できる可能性を秘めてる。
ffmpeg -i $INPUT -c:v libx264 -c:a aac -s 1280x720 output.mp4
補足
$INPUT
にvideo.avi
video.mov
video.mp4
など圧縮したい動画を入れる。-s 1280x720
はサイズなので適宜変更する。- outputの名前は適当に変えていいけど拡張子は
.mp4
縛り。 -b:v 2500k
とかするとビットレート変更できる。(多分デフォルトは2500K)
その2「本気で軽くしたい!」のとき
VBR 2pathというエンコード形式。(Variable Bit Rateの略。2pathはエンコードする前に1度ファイル全体をスキャンする方法)シーンによって、クオリティを高くしたり低くしたりして書き出ししてくれるので、CBRと比較すると「激しい&静か」のシーンが混在する動画を効率良く圧縮できる。
ただ、エンコードする前に1度全体をスキャンしているので2度エンコードしてる感覚だと思う。つまり、単純計算でCBRの倍時間がかかる。
あと動画によって容量/時間の差が出る。
画質落としてもいいときは、決めでビットレートを-b:v 2500k
とかしちゃえばいいと思うんですが、そうでない場合は画質を見つつ何度か圧縮してみる必要ありそうです。
ffmpeg -i $INPUT -c:v libx264 -an -pass 1 -s 1280x720 -f mp4 /dev/null && \ ffmpeg -i $INPUT -c:v libx264 -b:v 2500k -c:a aac -pass 2 -s 1280x720 output.mp4
補足
$INPUT
にvideo.avi、video.movやvideo.mp4を入れる(必ず1行目、2行目とも両方同じ文字にする)-s 1280x720
はサイズなので適宜変更する。- outputの名前は適当に変えていいけど拡張子は
.mp4
縛り -b:v 〇〇k
の部分を変えて画質を調整する。HDだと1000k ~ 5000k
くらいかなという印象。〇〇Mの指定もできる。-b:a 〇〇k
を追加すると音質も指定できる。だいたい128k
64k
32k
くらいを指定していればいいと思う。音についてはあんまり詳しくないです。- 動画のビットレート部分はこちらを参考に計算すると良いみたいです。
- 一度
path1
を通したあとにビットレートを変更して書き出し直したいときは、2行目のpath2のみの実行で大丈夫です。 - windowsの方は
/dev/null
の部分をNUL
に変更する必要があるそうです。
最後に
書き出し終わったら、「どのくらい圧縮されたか」「画質はどんなもんか」「音ありの場合、音もちゃんとあるか」「音ズレはないか」など最低限は確認しましょう。
また、ffmpegはCUIなので、ネットワーク上で、送られてきた動画を一定のクオリティまで圧縮してあげたりみたいな処理をすることもできるみたいです。
まあ、ぼくはサーバー側の知識そんなないんで詳しいことはわからないんですが。
コマンドラインからの動画圧縮の方法を説明をさせてていただいたんですが、動画圧縮にこのツールを絶対使わなければいけないとか、そういう縛りはないと思うので、
今まで通りの方法がいい人やGUIでやりたい人は、AdobeMediaEncorderとかffmpegのGUI版とか使ったらいいと思います。
ぼくはコマンドラインから動画圧縮する幸せライフを送ります。
オプション情報解説
-i
動画の情報を見る-c:v libx264
動画のcodecをh264にする。-c:a aac
音声のコーデックをaacにする。
音声コーデックについてはlibfdk_aacというコーデックの方が綺麗に圧縮できる模様。ただしデフォルトでは入っていないのでこちらを参考にインストールする必要あります。-an
audio none とかそういうこと。
2-passエンコードの時の1回目は音関係なしなので -anにしているみたいです。-s
画面サイズ変更-s 1280x720
とかする。-b
ビットレートを設定する。:v
ビデオの~
という事。
codecとかbitrateなどoptionの後についてる。-c:v
-b:v
みたいなこと。:a
上に同じく音声の~
ということ。
参考資料
以下とても参考になったサイトを記します。
- ffmpeg公式wiki <= ffmpepg公式DOC
- サンプルで使って慣れる。ffmpegの使い方。 <= とても教え上手でした。
- ビットレートとは? 画質・音質・コーデックとの関係【映像・音声】 <= ビットレート?? コーデック?? な人のために。
- FFmpegから使えるAACエンコーダの音質比較 <=
libfdk_aac
が綺麗らしいということがわかる記事。