てくてくテック

【雑学】CUIでコンソールから動画を圧縮する方法!(MacOS)

雑学

どーも!

たかぽんです!

今回はmacbookにてコンソールから動画を圧縮する方法を調べてみようと思います!

CUIでコンソールから動画を圧縮する方法!(MacOS)

さて、それではみていきましょう!

と、今回CUIで動画の圧縮をやっていくのですが、そのためには準備が必要です。

homebrewを使ってffmpegというツールを使っていきます。

このffmpegというツールは動画や画像に対する操作を色々できるツール...と思ってもらっていいかと思います!

公式ページは以下です。

さて、それではこのツールをコンソールからインストールしていきます。

homebrewというパッケージマネージャ(ツールをインストールする際等に使うもの)をまだインストールできていない方は以下から準備をしてから、コマンドを実行してください。

https://tektektech.com/wp-admin/post.php?post=1274&action=edit

実行するコマンドは以下です。

brew install ffmpeg

問題なければ特にエラー等は出ずに以下のようになるかと思います。

taka@Taka CUI-test % brew install ffmpeg
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
...
(省略...)
...
For pkg-config to find icu4c you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"

==> tesseract
This formula contains only the "eng", "osd", and "snum" language data files.
If you need any other supported languages, run `brew install tesseract-lang`.
taka@Taka CUI-test %

では、インストールができたかの確認をしておきます。

以下のコマンドを実行すると...?

ffmpeg -version
taka@Taka CUI-test % ffmpeg -version
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
built with Apple clang version 12.0.0 (clang-1200.0.32.27)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_4 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil      56. 51.100 / 56. 51.100
libavcodec     58. 91.100 / 58. 91.100
libavformat    58. 45.100 / 58. 45.100
libavdevice    58. 10.100 / 58. 10.100
libavfilter     7. 85.100 /  7. 85.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100

筆者が試している際のffmpegのversionは4.3.1のようですね。

では、次から早速!圧縮してみようと思います!

一般的なh264形式の720pで書き出す

今回はお試しということで、より汎用的に使えそうなh264というエンコードのコーデックを使用し、解像度は720pにて書き出しをしてみます。

テスト動画は以前一眼レフで撮影した21GBのテストデータです。

元の設定が無駄すぎるくらい高画質なはずなので、だいぶんファイルサイズも小さくなるはず...!

今回、CUIでの実行を行うので、あらかじめテスト動画を入れたフォルダにcdで移動しておきましょう。

taka@Taka CUI-test % ls
test.MP4

今回はテスト用の変換元動画がtest.MP4です。

いったんコマンドの詳細は気にしなくてもOKなので、"test.MP4"があるファイルで以下を実行します。

ffmpeg -i test.mp4 -c:v libx264 -s 1280x720 compressed.mp4

すると、変換作業が始まります。

taka@Taka CUI-test % ffmpeg -i test.mp4 -c:v libx264 -s 1280x720 compressed.mp4
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 12.0.0 (clang-1200.0.32.27)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_4 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
...
...
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
  Metadata:
    major_brand     : XAVC
    minor_version   : 16785407
    compatible_brands: XAVCmp42iso2
    creation_time   : 2020-09-13T13:32:04.000000Z
  Duration: 00:29:50.79, start: 0.000000, bitrate: 97829 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-4), 3840x2160 [SAR 1:1 DAR 16:9], 96040 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2020-09-13T13:32:04.000000Z
      handler_name    : Video Media Handler
      encoder         : AVC Coding
    Stream #0:1(und): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, stereo, s16, 1536 kb/s (default)
    Metadata:
      creation_time   : 2020-09-13T13:32:04.000000Z
      handler_name    : Sound Media Handler
    Stream #0:2(und): Data: none (rtmd / 0x646D7472), 245 kb/s (default)
    Metadata:
      creation_time   : 2020-09-13T13:32:04.000000Z
      handler_name    : Timed Metadata Media Handler
      timecode        : 02:15:43:09

...
...
...
Output #0, mp4, to 'compressed.mp4':
  Metadata:
    major_brand     : XAVC
    minor_version   : 16785407
    compatible_brands: XAVCmp42iso2
    encoder         : Lavf58.45.100
    Stream #0:0(und): Video: h264 (libx264) (avc1 / 0x31637661), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 29.97 fps, 30k tbn, 29.97 tbc (default)
    Metadata:
      creation_time   : 2020-09-13T13:32:04.000000Z
      handler_name    : Video Media Handler
      encoder         : Lavc58.91.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2020-09-13T13:32:04.000000Z
      handler_name    : Sound Media Handler
      encoder         : Lavc58.91.100 aac
frame= 5787 fps= 50 q=29.0 size=   10752kB time=00:03:13.13 bitrate= 456.1kbits/s speed=1.66x

最初にffmpegのバージョン情報等が、途中で入力されている変換元の動画情報が、そして後半に書き出し中の動画の情報が記載されているのがわかりますね。

では、待ち時間中に先程のコマンドを簡単に解説しておきます。

ffmpeg -i test.mp4 -c:v libx264 -s 1280x720 compressed.mp4

今回、上記で行われる内容は、-iでinputファイルの指定をしているので、test.mp4というファイルが変換対象になります。

そして、"-c:v"オプションはエンコードに使用するコーデックの指定をしていて、今回は一般的なh264形式を指定しています。

そして、"-s"オプションでは解像度を指定しています。(1280x720,)

これらの形に動画を変換することで、結果的にファイルサイズが小さくなります。

処理が終わると...?

以下のような表示がされました。

video:69750kB audio:28071kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.967888%
[libx264 @ 0x7fe49702d800] frame I:215   Avg QP:19.54  size: 46650
[libx264 @ 0x7fe49702d800] frame P:13570 Avg QP:21.47  size:  2484
[libx264 @ 0x7fe49702d800] frame B:39885 Avg QP:23.29  size:   694
[libx264 @ 0x7fe49702d800] consecutive B-frames:  0.4%  1.1%  1.2% 97.3%
[libx264 @ 0x7fe49702d800] mb I  I16..4: 25.5% 62.2% 12.3%
[libx264 @ 0x7fe49702d800] mb P  I16..4:  0.4%  1.2%  0.2%  P16..4: 15.2%  1.2%  2.0%  0.0%  0.0%    skip:80.0%
[libx264 @ 0x7fe49702d800] mb B  I16..4:  0.0%  0.2%  0.0%  B16..8: 10.7%  0.3%  0.0%  direct: 0.1%  skip:88.7%  L0:47.8% L1:51.8% BI: 0.4%
[libx264 @ 0x7fe49702d800] 8x8 transform intra:68.0% inter:93.5%
[libx264 @ 0x7fe49702d800] coded y,uvDC,uvAC intra: 53.2% 69.4% 37.3% inter: 1.1% 4.1% 0.0%
[libx264 @ 0x7fe49702d800] i16 v,h,dc,p: 12% 16%  3% 69%
[libx264 @ 0x7fe49702d800] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 14% 13%  7%  8%  9%  7% 11%  6%
[libx264 @ 0x7fe49702d800] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 20% 14%  6%  8%  7%  7%  6%  4%
[libx264 @ 0x7fe49702d800] i8c dc,h,v,p: 51% 21% 23%  5%
[libx264 @ 0x7fe49702d800] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x7fe49702d800] ref P L0: 70.3%  3.4% 18.2%  8.1%  0.0%
[libx264 @ 0x7fe49702d800] ref B L0: 83.7% 11.0%  5.3%
[libx264 @ 0x7fe49702d800] ref B L1: 96.6%  3.4%
[libx264 @ 0x7fe49702d800] kb/s:319.07
[aac @ 0x7fe497035400] Qavg: 184.903

今回、21GBと動画でも結構なサイズの動画を処理したので30分程度かかりました...

一応、最新のM1チップ搭載Macで6コアが稼働してそれだけかかっているので、ほかのPCでもそれなりに時間がかかってしまうかと思います。

CPUの使用率が540%... おそろしや......!

お手軽に試す...くらいの場合は数十〜数百MB程度のファイルを推奨です...!

では、圧縮後の動画の情報を見比べてみましょう。

出来上がったファイルの一般情報欄を確認すると以下のようになっています。(output.mp4が圧縮後のファイルです。)

21.9GBはおよそ21900MBなので...

117/21900 = 0.0053

およそ200分の1程度のサイズに圧縮できていますね...!

実際の動画の画質は筆者が見た限りだと対して変わっているようには見えませんでした...!

今回特に見て欲しいのが詳細情報のサイズです。

フルサイズの一眼レフで撮影した高画質設定の動画だと3840x2160となっていますが、1280x720に変わっています。これは俗にいう720pの解像度というやつで、正直youtubeの動画とうもこれだけの解像度があれば十分なので、ここを改善するだけでも大きくファイルサイズは小さくなるはずです。(元の動画サイズがおおきい場合は...)

実際に、それぞれの解像度を掛けた数(=動画のフレームを表す細かいピクセルの数)の比をとると...

(1280 * 720) / (3840 * 2160) = 0.11111...

となり、720pにすることで、10分の1程度になっていることがわかりますね。

また、これに加えてbitrateも容量に影響を与える要因になります。

もしより小さく!とか、画質が変な場合などはbitrateも指定できるので、そちらを調べてみるとよさそうです...!

ffmpegの公式ドキュメント

僕もまだffmpegを触り始めたばかりで、そんなに読み込めてはいないのですが...

動画のデータを色々いじりたい...!(俗にいう動画編集とは異なり...)

けど、どうやってやればいいの?ってことは多くあると思います。

そんなとき、なんだかんだ公式ドキュメントが一番頼りになるので、英語ではありますが、是非以下を一読してみてください...!

特にCUIツール周りは以下のURLにて解説されてます。

まとめ

今回はffmpegを使って大きな動画ファイルを圧縮してみました。

実際には不要な画質や解像度のサイズを変更して小さくした形ですが、思ったよりも小さくなっていてびっくりです...!

一眼で撮った動画だった...というのももちろんあるかもしれませんが、現状十分な720pや1080pあたりの解像度での設定に変えてあげるだけでも大分動画の保存コストなどは下がりそうですね...!

筆者もせっかくfinal cut Proの入ったM1MacbookProに新調したので、そのうち動画編集とかも手を出してみたい...

それでわ!

モバイルバージョンを終了