Old silly thing, let's shove it on git
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
*.mp4
|
||||
.idea/*
|
||||
.idea
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
import cv2
|
||||
import sys
|
||||
import time
|
||||
|
||||
BLACK = "⬛"
|
||||
WHITE = "⬜"
|
||||
|
||||
def frame_to_emoji(frame, threshold=128):
|
||||
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||
|
||||
lines = []
|
||||
for row in gray:
|
||||
line = "".join(
|
||||
WHITE if pixel > threshold else BLACK
|
||||
for pixel in row
|
||||
)
|
||||
lines.append(line)
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
def main(video_path, width=80):
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
|
||||
if not cap.isOpened():
|
||||
print(f"Could not open {video_path}")
|
||||
return
|
||||
|
||||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||||
if fps <= 0:
|
||||
fps = 24
|
||||
|
||||
frame_delay = 1.0 / fps
|
||||
|
||||
while True:
|
||||
start = time.time()
|
||||
|
||||
ret, frame = cap.read()
|
||||
if not ret:
|
||||
break
|
||||
|
||||
h, w = frame.shape[:2]
|
||||
|
||||
# terminal characters are taller than wide
|
||||
aspect = h / w
|
||||
height = max(1, int(width * aspect * 0.5))
|
||||
|
||||
frame = cv2.resize(
|
||||
frame,
|
||||
(width, height),
|
||||
interpolation=cv2.INTER_AREA
|
||||
)
|
||||
|
||||
emoji_frame = frame_to_emoji(frame)
|
||||
|
||||
# clear screen, move cursor to home pos
|
||||
sys.stdout.write("\033[H\033[J")
|
||||
sys.stdout.write(emoji_frame)
|
||||
sys.stdout.flush()
|
||||
|
||||
elapsed = time.time() - start
|
||||
sleep_time = frame_delay - elapsed
|
||||
if sleep_time > 0:
|
||||
time.sleep(sleep_time)
|
||||
|
||||
cap.release()
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: python pyvid2term.py video.mp4 [width]")
|
||||
sys.exit(1)
|
||||
|
||||
video = sys.argv[1]
|
||||
width = int(sys.argv[2]) if len(sys.argv) > 2 else 80
|
||||
|
||||
main(video, width)
|
||||
Reference in New Issue
Block a user