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"))
コメント