🎥 VideoCoF
Unified Video Editing with Temporal Reasoner
import streamlit as st import os import tempfile import time from datetime import timedelta import pandas as pd import numpy as np from typing import Optional, Tuple, List import plotly.graph_objects as go from utils import ( process_video_upload, extract_video_info, create_timeline_figure, apply_editing_effects, export_video ) # Set page config st.set_page_config( page_title="VideoCoF - Unified Video Editing", page_icon="🎥", layout="wide", initial_sidebar_state="expanded" ) # Custom CSS for modern styling st.markdown(""" """) # Header with anycoder link st.markdown("""
""", unsafe_allow_html=True) # Initialize session state if 'video_file' not in st.session_state: st.session_state.video_file = None if 'video_info' not in st.session_state: st.session_state.video_info = None if 'edited_video' not in st.session_state: st.session_state.edited_video = None if 'timeline_data' not in st.session_state: st.session_state.timeline_data = None if 'is_processing' not in st.session_state: st.session_state.is_processing = False # Sidebar for controls with st.sidebar: st.header("🎛️ Controls") # Video upload section st.subheader("Upload Video") uploaded_file = st.file_uploader( "Choose a video file", type=["mp4", "avi", "mov", "mkv"], help="Supported formats: MP4, AVI, MOV, MKV" ) if uploaded_file and not st.session_state.is_processing: if st.button("Load Video", type="primary"): st.session_state.is_processing = True with st.spinner("Processing video..."): # Process the uploaded video temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.mp4') temp_file.write(uploaded_file.read()) temp_file.close() # Extract video info video_info = extract_video_info(temp_file.name) st.session_state.video_info = video_info # Create timeline data st.session_state.timeline_data = create_timeline_figure(video_info) # Store video file st.session_state.video_file = temp_file.name # Clean up os.unlink(temp_file.name) st.session_state.is_processing = False st.rerun() # Main content area if st.session_state.video_file: # Video player section st.subheader("🎬 Video Player") col1, col2 = st.columns([3, 1]) with col1: st.video(st.session_state.video_file) with col2: if st.session_state.video_info: st.metric("Duration", f"{st.session_state.video_info['duration']:.2f}s") st.metric("Resolution", f"{st.session_state.video_info['width']}×{st.session_state.video_info['height']}") st.metric("FPS", f"{st.session_state.video_info['fps']}") # Timeline section st.subheader("⏱️ Timeline Editor") if st.session_state.timeline_data: st.plotly_chart(st.session_state.timeline_data, use_container_width=True) # Editing controls st.subheader("✂️ Editing Tools") editing_tabs = st.tabs(["Trim", "Effects", "Filters", "Speed"]) with editing_tabs[0]: # Trim tab col1, col2 = st.columns(2) with col1: start_time = st.slider( "Start Time", 0.0, st.session_state.video_info['duration'], 0.0, step=0.1, help="Set the start time of the video segment" ) with col2: end_time = st.slider( "End Time", 0.0, st.session_state.video_info['duration'], st.session_state.video_info['duration'], step=0.1, help="Set the end time of the video segment" ) with editing_tabs[1]: # Effects tab effects = st.multiselect( "Apply Effects", ["Fade In", "Fade Out", "Crossfade", "Blur", "Sharpen"], help="Select effects to apply to the video" ) with editing_tabs[2]: # Filters tab filters = st.selectbox( "Video Filter", ["None", "Grayscale", "Sepia", "Vintage", "Cool", "Warm"], help="Apply a visual filter to the video" ) with editing_tabs[3]: # Speed tab speed = st.slider( "Playback Speed", 0.25, 2.0, 1.0, step=0.25, help="Adjust the playback speed of the video" ) # Apply edits button if st.button("Apply Edits", type="primary"): with st.spinner("Applying edits..."): st.session_state.edited_video = apply_editing_effects( st.session_state.video_file, start_time, end_time, effects, filters, speed ) st.success("Edits applied successfully!") # Export section st.subheader("💾 Export Options") export_format = st.selectbox( "Export Format", ["MP4", "AVI", "MOV"], help="Choose the output format for your edited video" ) if st.session_state.edited_video: col1, col2 = st.columns([1, 1]) with col1: if st.button("Download Edited Video"): with open(st.session_state.edited_video, "rb") as file: st.download_button( label="Download", data=file, file_name=f"edited_video.{export_format.lower()}", mime=f"video/{export_format.lower()}" ) with col2: if st.button("Export to Cloud"): st.info("Cloud export functionality coming soon!") else: st.info("📁 Please upload a video file to get started with VideoCoF!")