freddyaboulton's picture
Upload folder using huggingface_hub
6d0588f verified
import gradio as gr
import cv2 # type: ignore
import os
from pathlib import Path
import atexit
current_dir = Path(__file__).resolve().parent
def delete_files():
for p in Path(current_dir).glob("*.ts"):
p.unlink()
for p in Path(current_dir).glob("*.mp4"):
p.unlink()
atexit.register(delete_files)
def process_video(input_video, stream_as_mp4):
cap = cv2.VideoCapture(input_video)
video_codec = cv2.VideoWriter_fourcc(*"mp4v") if stream_as_mp4 else cv2.VideoWriter_fourcc(*"x264") # type: ignore
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
iterating, frame = cap.read()
n_frames = 0
n_chunks = 0
name = str(current_dir / f"output_{n_chunks}{'.mp4' if stream_as_mp4 else '.ts'}")
segment_file = cv2.VideoWriter(name, video_codec, fps, (width, height)) # type: ignore
while iterating:
# flip frame vertically
frame = cv2.flip(frame, 0)
display_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
segment_file.write(display_frame)
n_frames += 1
if n_frames == 3 * fps:
n_chunks += 1
segment_file.release()
n_frames = 0
yield name
name = str(
current_dir / f"output_{n_chunks}{'.mp4' if stream_as_mp4 else '.ts'}"
)
segment_file = cv2.VideoWriter(name, video_codec, fps, (width, height)) # type: ignore
iterating, frame = cap.read()
segment_file.release()
yield name
with gr.Blocks() as demo:
gr.Markdown("# Video Streaming Out 📹")
with gr.Row():
with gr.Column():
input_video = gr.Video(label="input")
checkbox = gr.Checkbox(label="Stream as MP4 file?", value=False)
with gr.Column():
processed_frames = gr.Video(
label="stream",
streaming=True,
autoplay=True,
elem_id="stream_video_output",
)
with gr.Row():
process_video_btn = gr.Button("process video")
process_video_btn.click(process_video, [input_video, checkbox], [processed_frames])
gr.Examples(
[
[
os.path.join(
os.path.dirname(__file__),
"video/compliment_bot_screen_recording_3x.mp4",
),
False,
],
[
os.path.join(
os.path.dirname(__file__),
"video/compliment_bot_screen_recording_3x.mp4",
),
True,
],
],
[input_video, checkbox],
fn=process_video,
outputs=processed_frames,
cache_examples=False,
)
if __name__ == "__main__":
demo.launch()