4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonで複数の動画を自動圧縮

Last updated at Posted at 2022-01-27

概要

画面キャプチャでとった動画たちがHDDの容量を圧迫しているので、圧縮したい。
容量の小さい動画(既に圧縮済だったりする)も混ざっているので、容量の大きい動画だけピックアップして圧縮するようにする。
圧縮にはffmpegというソフトを使うのが簡単そう。
Pythonからの操作もできるから、Pythonで書くことにする。

ffmpegのインストール

ここの記述に従ってffmpegをインストールしてパスを通す。

処理の流れ

  1. 動画ファイル名にスペースが入っているとエラーの原因になるので、これを取り除く。
  2. カレントディレクトリ中の .mp4 のファイルすべてのパスのリストを取得。
  3. for文で得られたリストを回す。動画の容量が1GB以上か判定し大きければ圧縮。
  4. 圧縮前の動画(思い通り圧縮できないかもしれないので一応とっておく)の名前を圧縮後と区別しやすいように変更。

コード

import glob
import os
import subprocess
# ①
videos = glob.glob('./*.mp4')

# ②ファイル名にスペースが入っているとエラーになるので、取り除いておく。
for video in videos:
    os.rename(video, video.replace(' ', ''))

# ③
videos = glob.glob('./*.mp4')

count = 0
# ビデオの容量が1GB以上か判定し、大きければ圧縮
for video in videos:
    size = os.path.getsize(video)
    if size>1000000000:
        #④圧縮
        subprocess.call('ffmpeg -i '+video+' -crf 18 '+video[:-3]+'_圧縮済.mp4', shell=True)
        
        #⑤元動画の名前を変更する。消しやすいように、まとまって配置させるため番号をつける。
        os.rename(video, './'+str(count)+'_圧縮前_'+video[2:])
        count += 1

①まずは globでカレントディレクトリ内 mp4のパスすべてのリストを取得。
②リストのパスを使って mp4ファイル名からスペースを取り除くループを回す。
③ファイル名を変更したのでパスのリストも更新しておく。
④ffmpegの圧縮はシェルコマンドで行う。Pythonからシェルコマンドを呼び出すには subprocess.callを使う。
crfの値を変えると動画の品質を指定できる。
⑤圧縮前の動画ファイル名を分かりやすいように変えておく。番号を振っておくとソートしたとき並んで表示されるので成功確認した後で消すときにやりやすい。
0_圧縮前_元の名前.mp4 とか 1_圧縮前_元の名前.mp4
みたいになる。

結果

ものによっては容量が10分の1以下になった。
ffmpegってすごい。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?