|
#!/usr/bin/env python3 |
|
import logging |
|
import sys |
|
import streamlink |
|
import os.path |
|
import datetime |
|
|
|
try: |
|
import cv2 |
|
except ImportError: |
|
sys.stderr.write("This script requires opencv-python to be installed") |
|
raise |
|
|
|
log = logging.getLogger(__name__) |
|
|
|
|
|
def stream_to_url(url, quality='best'): |
|
streams = streamlink.streams(url) |
|
if streams: |
|
return streams[quality].to_url() |
|
else: |
|
raise ValueError("No steams were available") |
|
|
|
|
|
def main(url, quality='best', ipf=8): |
|
stream_url = stream_to_url(url, quality) |
|
log.info("Loading stream {0}".format(stream_url)) |
|
cap = cv2.VideoCapture(stream_url) |
|
|
|
frame_last_save_time = datetime.datetime.now() - datetime.timedelta(seconds=ipf) |
|
while True: |
|
try: |
|
ret, frame = cap.read() |
|
if ret: |
|
if frame_last_save_time <= datetime.datetime.now() - datetime.timedelta(seconds=ipf): |
|
frame_last_save_time = datetime.datetime.now() |
|
print(frame_last_save_time) |
|
time_str = str(frame_last_save_time).replace(' ', '_').replace(':', '-').replace('.', '-') + '_' + str(frame_last_save_time.timestamp()).replace('.', '-') |
|
cv2.imwrite('Frame-'+time_str+'.jpg', frame) |
|
else: |
|
break |
|
except KeyboardInterrupt: |
|
break |
|
|
|
cap.release() |
|
|
|
|
|
if __name__ == "__main__": |
|
import argparse |
|
logging.basicConfig(level=logging.INFO) |
|
|
|
parser = argparse.ArgumentParser(description="Save frame in given interval via Streamlink and opencv") |
|
parser.add_argument("url", help="URL of Stream") |
|
parser.add_argument("--stream-quality", help="Requested stream quality [default=best]", |
|
default="best", dest="quality") |
|
parser.add_argument("--ipf", help="Frame Capture interval (expect ~2 sec less ipf) [default=8]", |
|
default=8, type=int) |
|
|
|
opts = parser.parse_args() |
|
|
|
main(opts.url, opts.quality, opts.ipf) |