Last active
September 1, 2023 12:51
-
-
Save ksasao/3bab6663173c84f3a0f94948395c7889 to your computer and use it in GitHub Desktop.
ATOM Cam 2 の映像を RTSP で受信して1分毎にファイル名を変えて動画で保存する Python コード。詳細→ https://twitter.com/ksasao/status/1593834857536585729
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 指定したフォルダの動画を再圧縮して元動画を削除 | |
# あらかじめ 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