Skip to content

Instantly share code, notes, and snippets.

@ksasao
Last active September 1, 2023 12:51
Show Gist options
  • Save ksasao/3bab6663173c84f3a0f94948395c7889 to your computer and use it in GitHub Desktop.
Save ksasao/3bab6663173c84f3a0f94948395c7889 to your computer and use it in GitHub Desktop.
ATOM Cam 2 の映像を RTSP で受信して1分毎にファイル名を変えて動画で保存する Python コード。詳細→ https://twitter.com/ksasao/status/1593834857536585729
# RTSPを受信して .mp4 にエンコード
# ATOM Cam 2 は 20fps が標準 (赤外カメラモードでは15fpsとなるが下記コードは未対応)
import cv2
import datetime
import os
# 日付をファイル名にする
def get_filename():
now = datetime.datetime.now()
filename = './mp4/' + now.strftime('%Y%m%d_%H%M') + '.mp4'
return filename
# RTSPで受信
camera = cv2.VideoCapture('rtsp://aaaa:bbb@192.168.3.xxx/live') # RTSPのURLを設定
fps = int(camera.get(cv2.CAP_PROP_FPS))
w = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
# 保存先フォルダ作成
old_filename = get_filename()
dirname = os.path.dirname(old_filename)
os.makedirs(dirname, exist_ok=True)
print(old_filename)
video = cv2.VideoWriter(old_filename, fourcc, fps, (w, h))
while(True):
try:
ret, frame = camera.read()
cv2.imshow('frame',frame)
# ファイル名が変わったら VideoWriter を開きなおす
filename = get_filename()
if filename != old_filename:
video.release()
old_filename = filename
print(old_filename)
video = cv2.VideoWriter(old_filename, fourcc, fps, (w, h))
video.write(frame)
except:
print("camera read error")
# プレビュー画面上で q キーを押して終了
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video.release()
camera.release()
cv2.destroyAllWindows()
# 指定したフォルダの動画を再圧縮して元動画を削除
# あらかじめ ffmpeg にパスを通しておく
import datetime
import os
from pathlib import Path
import subprocess
target_path = "./mp4" # 圧縮対象のパス
log_path = "./log" # 保存先のパス
files = list(Path(target_path).glob('./*.mp4'))
now = datetime.datetime.now().strftime('%Y%m%d_%H')
for item in files:
# yyyyMMdd のフォルダを作成し、動画を圧縮して移動
# ファイル名が yyyyMMdd_HH まで一致した場合はスキップ(1時間ごとに実行することを想定)
if now not in item.name:
path = log_path + "/" + item.name[0:8] + "/"
os.makedirs(path, exist_ok=True)
input_file = str(item.absolute())
output_file = path + item.name
try:
# -crf は固定品質のパラメータ(値が大きいほどファイルが小さくなる)
subprocess.check_output('ffmpeg -i ' + input_file + " -crf 38 -y " + output_file, shell=False)
os.remove(input_file)
except:
print("encode error")
else:
print("Skip: " + item.name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment