pythonで特定フォルダ内のtsファイルをmp4ファイルに一括変換するスクリプト

python コンピュータ

ts形式の動画ファイルはファイルサイズが大きい傾向にあり保管用にファイルサイズを小さくするためmp4形式に変換します。変換は定番のffmpegで行いますが、処理するtsファイルが書き込み中である可能性も考慮して、tsファイルの更新日時が1日以上前のファイルのみを対象としています。

この類の変換処理はtsファイルが録画などで作成された事をトリガーとして同一のパソコン内で実行する処理ですが、このスクリプトは共有フォルダを定期的に監視し対象のtsファイルが存在する場合、外部のパソコンからから一括変換処理を行うスクリプトになります。

実行環境はubunt上のcronで指定時間に実行することを想定していますが、たぶんWindowsでも動くと思います。

ご利用の場合は各種パスや文字コード、ffmpegのオプションは実行環境に合わせる必要があります。

スクリプト

# coding: utf8

# ffmpegで更新日が前日以前のtsファイルをmp4に変換

import glob
import os
import time
import datetime
import time
import subprocess

nw = time.time()                          # 現在の日時を取得
dt = datetime.datetime.fromtimestamp(nw)  # datetime型に変換
dt = dt - datetime.timedelta(days=1)      # 一日減残
nw = dt.timestamp()                       # タイムスタンプ形式に変換


for inpath in glob.glob('/home/share/TV/*.ts'):  # tsファイルのみを取得
	if (os.stat(inpath).st_mtime < nw):          # ファイルの更新日付が前日以前
		
		pair = os.path.splitext(inpath)  # 拡張子とそれ以外を分離
		outpath = pair[0] + ".mp4"  # 拡張子をmp4とした出力パスを生成
		
		# ffmpegのコマンド生成
		cmd = "/usr/bin/ffmpeg -i '" + inpath + "' -vf bwdif=1 -c:v libx264 -preset veryfast -crf 23 -c:a copy -bsf:a aac_adtstoasc -s 1280x720 '" + outpath + "'"
		print(cmd)
		proc = subprocess.run(cmd, shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
		if (proc.returncode == 0):
			print("成功")
			print(proc.stdout.decode("utf8"))
			os.remove(inpath)  # tsファイルの削除
		else:
			print("失敗")
			print(proc.stdout.decode("utf8"))
			print(proc.stderr.decode("utf8"))

感想

pythonで初めて作成したスクリプトになります。pythonで作る必要があるかは別にして勉強としてpythonで作ってみました。
エラー処理やログの出力など理解が足りない部分も多々ありますが、実際に使いながら不具合があったら都度修正していきたいと思います。

コメント