RaspCam/server/lib/recorder.py
2020-05-15 12:27:34 +02:00

74 lines
2.0 KiB
Python
Executable File

#!/usr/bin/python
import sys
import os
import signal
import subprocess
import shutil
import re
import time
def on_term(signum, frame):
global ffmpeg
global record_enabled
record_enabled = False
if ffmpeg != None and ffmpeg.poll() == None:
ffmpeg.terminate()
try:
os.remove(os.path.join(record_path, "current.mp4"))
except:
pass
sys.exit(0)
elif ffmpeg == None:
sys.exit(0)
if len(sys.argv) != 3:
sys.stderr.write("Error : Bad arguments count\n")
sys.exit(1)
ffmpeg = None
record_enabled = True
rtmp_link = sys.argv[1] + "?login=root&password=99c9bef14824f6a9b7e6ee4229660827a4a4c751"
stream_name = sys.argv[2]
fragment_time = 3600
fragment_max_count = 48
record_path = os.path.join(os.path.abspath(os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), "../webplatform/www/Content/records")), stream_name)
if not os.path.exists(record_path):
try:
os.mkdir(record_path)
except OSError:
sys.stderr.write("Error : Unable to create the record directory\n")
sys.exit(2)
signal.signal(signal.SIGINT, on_term)
while record_enabled:
files = os.listdir(record_path)
for filename in files:
filepath = os.path.join(record_path, filename)
if os.path.isfile(filepath):
match = re.search("^([0-9]|[1-9][0-9]*)_([0-9]|[1-9][0-9]*)\.mp4$", filename)
if match:
if (int(time.time()) - int(match.group(1))) / fragment_time > fragment_max_count:
try:
os.remove(filepath)
except OSError:
sys.stderr.write("Error : Unable to delete video backup file\n")
sys.exit(3)
start_time = str(int(time.time()))
ffmpeg = subprocess.Popen(["/usr/bin/ffmpeg", "-re", "-y", "-i", rtmp_link, "-an", "-vcodec", "copy", "-movflags", "faststart", "-f", "mp4", "-t", str(fragment_time), os.path.join(record_path, "current.mp4")])
ffmpeg.wait()
try:
os.rename(os.path.join(record_path, "current.mp4"), os.path.join(record_path, "{}_{}.mp4".format(start_time, str(int(time.time())))))
except OSError:
sys.stderr.write("Error : Unable to rename the current video backup file\n")
sys.exit(4)
ffmpeg = None