workoutwizard / pages /7_record.py
whitphx's picture
whitphx HF staff
Fix all the demos to use Twilio STUN/TURN servers
1328fff
raw
history blame
No virus
1.94 kB
import uuid
from pathlib import Path
import av
import cv2
import streamlit as st
from aiortc.contrib.media import MediaRecorder
from streamlit_webrtc import WebRtcMode, webrtc_streamer
from sample_utils.turn import get_ice_servers
def video_frame_callback(frame: av.VideoFrame) -> av.VideoFrame:
img = frame.to_ndarray(format="bgr24")
# perform edge detection
img = cv2.cvtColor(cv2.Canny(img, 100, 200), cv2.COLOR_GRAY2BGR)
return av.VideoFrame.from_ndarray(img, format="bgr24")
RECORD_DIR = Path("./records")
RECORD_DIR.mkdir(exist_ok=True)
def app():
if "prefix" not in st.session_state:
st.session_state["prefix"] = str(uuid.uuid4())
prefix = st.session_state["prefix"]
in_file = RECORD_DIR / f"{prefix}_input.flv"
out_file = RECORD_DIR / f"{prefix}_output.flv"
def in_recorder_factory() -> MediaRecorder:
return MediaRecorder(
str(in_file), format="flv"
) # HLS does not work. See https://github.com/aiortc/aiortc/issues/331
def out_recorder_factory() -> MediaRecorder:
return MediaRecorder(str(out_file), format="flv")
webrtc_streamer(
key="record",
mode=WebRtcMode.SENDRECV,
rtc_configuration={"iceServers": get_ice_servers()},
media_stream_constraints={
"video": True,
"audio": True,
},
video_frame_callback=video_frame_callback,
in_recorder_factory=in_recorder_factory,
out_recorder_factory=out_recorder_factory,
)
if in_file.exists():
with in_file.open("rb") as f:
st.download_button(
"Download the recorded video without video filter", f, "input.flv"
)
if out_file.exists():
with out_file.open("rb") as f:
st.download_button(
"Download the recorded video with video filter", f, "output.flv"
)
if __name__ == "__main__":
app()