概要
画面キャプチャでとった動画たちがHDDの容量を圧迫しているので、圧縮したい。
容量の小さい動画(既に圧縮済だったりする)も混ざっているので、容量の大きい動画だけピックアップして圧縮するようにする。
圧縮にはffmpegというソフトを使うのが簡単そう。
Pythonからの操作もできるから、Pythonで書くことにする。
ffmpegのインストール
ここの記述に従ってffmpegをインストールしてパスを通す。
処理の流れ
- 動画ファイル名にスペースが入っているとエラーの原因になるので、これを取り除く。
- カレントディレクトリ中の .mp4 のファイルすべてのパスのリストを取得。
- for文で得られたリストを回す。動画の容量が1GB以上か判定し大きければ圧縮。
- 圧縮前の動画(思い通り圧縮できないかもしれないので一応とっておく)の名前を圧縮後と区別しやすいように変更。
コード
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ってすごい。