今日は動画のファイルサイズを小さくするPythonプログラムを紹介します。といっても動画の圧縮はPythonで行うのではなく、ffmpegというフリーソフトを使用します。ffmpegは動画の切り出しや圧縮など多様な機能を持つプログラムですが、コマンドベースで使うため、PCのコマンド操作に慣れていない人には使いにくいと感じてしまうのではないかと思います。そこでGUIベースでffmpegを扱うためのPythonプログラムを作ったので紹介します。

  • もっと簡単にffmpegを使いたい
  • 動画の圧縮をしたいけどお金をかけたくない
  • ただ動画のサイズを小さくしたい(細かい設定は気にしない)

といった人には役に立つのではないかと思います。

準備

まずはffmpegを以下のサイトからダウンロードしてください。

https://ffmpeg.org/download.html

ここではWindowsを使っていることを前提に説明していきます。

「Windows builds by BtbN」のリンクをクリックすると、以下のようなサイトに移動します。ここでファイル名に「win64」と入っているものを選択してください。この説明では「ffmpeg-N-104402-g2aa343bb6f-win64-gpi.zip」を選択しました。

ダウンロードできました。

ダウンロードした圧縮ファイルを解凍し、解凍したフォルダを適当な場所に置きます。ここでは解凍したフォルダの名前を「ffmpeg」にして、Cドライブの直下に置きました(フォルダ名を変更しなくても構いませんが、長い名前だと煩わしいのでここではシンプルな名前に変更しています)。

「ffmpeg」フォルダの中身は以下のようになっています。

さらにbinフォルダの中にffmpegの本体が入っています。

次にffmpegの本体が入っている「C:\ffmpeg\bin」フォルダをWindowsのパスに登録します。

デスクトップのPCアイコンを右クリックして、「プロパティ」を選択すると出てくるダイアログの右側に以下のような項目がありますので、「システムの詳細設定」選びます。

システムのプロパティで「環境変数」を選択します。

環境変数の「Path」を選択し、「編集」ボタンを押します。

環境変数名の編集で、「新規」ボタンを押し、追加したいパス「C:\ffmpeg\bin」を入力して、「OK」を押します。

以上でWindowsにffmpegのパスを通すことができました。

「パスを通すとかよく分からないし面倒くさい」という人は、binフォルダの中身(ffmpeg.exe、ffplay.exe、ffprobe.exeの3ファイル)をこのあと紹介するPythonスクリプトと同じフォルダに入れても動作します。

ソースコード

先に今回のPythonプログラムのソースコードをお示しします。

ファイルはこちらからダウンロードできます。

プログラムの動作説明

それではPythonプログラムの動作について説明していきます。

この説明では以下にあるような5つのMP4ファイルを圧縮していきたいと思います。

Pythonプログラムを実行すると、以下のようなダイアログが表示されます。

入力フォーマットとしてデフォルトではmp4が指定されていますが、他にwmvとavi、さらにその他のフォーマット(すべて)も選ぶことができます。

圧縮率として「高」「低」の2段階を用意しています。

入力フォーマットと圧縮率を選んだあと、「圧縮処理」ボタンを押すと、ファイルを選択するダイアログが開きます。このダイアログで1つもしくは複数のファイルを選択し、「開く(O)」ボタンを押すと、動画ファイルの圧縮が始まります。

圧縮処理が始まると、以下のようにコンソール画面に圧縮処理のメッセージが表示されます。圧縮処理自体はffmpegが行っています。今回紹介しているPythonプログラムは、ファイルの選択と、選択したファイルをffmpegコマンドに渡す役割をするものだと思ってください。

しばらく待つと、処理終了のメッセージが出て完了です。

※注意
圧縮処理中はプログラムが「(応答なし)」状態になって、マウスクリックに反応しなくなります。何らかの理由でプログラムを途中で止めたい場合は、コンソール画面上でCtrl+Cを押してください。

それでは圧縮されたファイルを見てみましょう。圧縮されたファイルは元のファイル名の最後に「_圧縮」という文字が追加されて、元のファイルと同じフォルダに入っています。

まず圧縮率「高」で圧縮した結果です。98,964KBだったファイル「MVI_0351.MP4」が15,500KBの「MVI_0351_圧縮.mp4」にと、大幅にサイズが圧縮されています。ファイルによって圧縮される割合が違いますが、おおむねファイルサイズが元のサイズの20~30%にまで圧縮されています。ちょっと圧縮しすぎな感じもあります(汗)。

一方、圧縮率「低」で圧縮した結果です。元のサイズの40~70%まで圧縮されているのが分かります。

では画質をチェックするため実際の映像を見てみましょう。

元の動画はこちら

高圧縮したもの

低圧縮したもの

圧縮率「高」では映像が「もやっ」とした感じがして画質の悪さが気になりますが、圧縮率「低」であればほとんど違いに気づかないレベルです。

※注意
今回はかなりファイルサイズが圧縮されましたが、元のファイルがすでに圧縮されている場合は、かえってファイルサイズが大きくなることがあるかもしれませんのでご了承ください。

プログラムの説明

簡単にプログラムの説明をします。

ShrinkMovieというクラスを定義し、すべての処理をこのクラスで行っています。今回はtkinterを使用したGUIアプリになっていて、初期化関数(__init__関数)でGUIの設定をしています。

「圧縮処理」ボタンが押されるとshrink_mov_files関数が呼び出されるようになっています。shrink_mov_files関数が呼び出されると、まず入力ファイルの選択ダイアログを開きます。ドロップダウンメニューで選択された拡張子をもつファイルだけがファイル選択ダイアログに表示するようになっています。

つぎに圧縮率を設定しています。私はビデオのフォーマットについてはあまり詳しくないのですが、今回のプログラムではH.265というフォーマットを使うことでファイルサイズの圧縮をしています。

このH.265フォーマットはConstant Rate Factor(CRF)という値を調整することで圧縮率を変えることができます。CRFは0~51の値を取り、値が大きくなるほど圧縮率が高くなります(画質が低下します)。圧縮率を変えたい場合はここの値を変えてみてください。今回、圧縮率「高」をCRF=28、圧縮率「低」をCRF=23としましたが、もう少し圧縮率を小さくしてもいいかもと思いました。このあたりは好みに合わせて調整してください。

出力ファイル名を作成した後、subprocessのcall関数を使って、ffmpegコマンドを呼び出しています。

以上が簡単なプログラムの説明です。

さいごに

今日紹介したプログラムは、簡単に動画ファイルのサイズを小さくしたいという動機から作ったものです。誰かのお役に立てば幸いです。