こんにちは.
実験動画を圧縮する機会が増えてきました.
実験の動画を撮影した場合は,拡張子「MP4」で記録されます.
結果を記載するページは「mp4」のみ許可されています.
といっても,自作のwikiなので,拡張子の権限を増やしてやればいいだけなのですが...
まぁ,めんどくさいし,コマンド何回も打ち込むのだるいので,pythonで一気にやらしちゃおう!という内容です.
まず,ffmpegは必須です.
以下のコマンドでインストールしましょう.
※apt-get updateは行っておいた方が良いでしょう.
sudo apt-get install ffmpeg -y
私のPCにインストールしたffmpegのバージョン
少し古いかもしれません.
$ ffmpeg -version
ffmpeg version 4.3.2-0+deb11u2 Copyright (c) 2000-2021
the FFmpeg developers built with gcc 10 (Debian 10.2.1-6)
ソースコード
#! /usr/bin/python3
import subprocess as sp
import os
path = "./"
crf = str(28)
files = os.listdir(path) # 同一ディレクトリのファイルだけ取得します.
# 仮にディレクトリあっても無視されます.
#print(files)
tmp = []
for i in range(len(files)):
if "MP4" in files[i]: # 拡張子MP4のファイルのみ,圧縮対象とします.
tmp.append(files[i].split('.'))
tmp.sort()
#print(tmp)
# tmp[0][0] = ファイル名
# tmp[0][1] = 拡張子
for j in range(len(tmp)):
filename = tmp[j][0]
ext = tmp[j][1]
cmd = "ffmpeg -i " + filename + "." + ext + " -crf " + crf +" " + filename + ".mp4"
#print(cmd)
process = sp.Popen(cmd.split())
process.wait()
print()
print(j+1,"/",len(tmp))
print()
print("終了")
使い方
まず,ソースコードと同一ディレクトリに圧縮対象のファイルをすべて配置します.
そして,ソースコードを実行します.
シバン書いてますので,chmodして./で実行可能です.
基本的にファイル名は変更せず,拡張子だけ変更して保存します.
同一ディレクトリにpngファイルとか,txtファイル等が存在してたとしても,
指定した拡張子以外のファイルに関しては圧縮対象としない処理にしてますので,
エラーを未然に防ぎます.
process.wait()で1つ目のプロセスが終わるまで,待機します.
waitしなかった場合,並列処理で同時進行してしまいます.
CORE i5の10th GenがCPUとして入ってますが,なかなかうるさくなりますので,その仕様としています.
低スペックPCでも待っていれば,作業が終わるような処理です.
ffmpegのcrfオプションについて
crfオプションの後の数値には意味が有ります.
数値は,小さいほど画質が良い.
反対に大きいほど画質が悪い.
今回私は28という数値を選択しました.
15とか30とか45とか試したのですが,私の環境では,30前後が良いという直感的な答えで28を選択しました.
参考までに,約6分の動画を圧縮した際の圧縮前後のサイズ
圧縮前:607.9MB
圧縮後:35.9MB
圧縮率は 607:35 なので,大体 17:1 くらいですかね.
crfオプションの数値:1 になるかと思ってたんですが,そうでもない感じです.
拡張子との兼ね合いもありそうで,そこまで調べてる時間はないので,これくらいで.
間違いあったら教えて下さい.
それでは.