Felguk's picture
Update app.py
bcdcc4a verified
import gradio as gr
from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip, vfx
from moviepy.video.fx.all import blackwhite, colorx # Import specific effects from fx.all
from moviepy.video.tools.drawing import color_gradient # For additional effects if needed
import numpy as np
# Function to adjust audio pitch
def adjust_audio_pitch(input_video_path, pitch_factor):
video = VideoFileClip(input_video_path)
audio = video.audio
if audio is None:
return input_video_path # No audio to process
# Adjust pitch (this is a simplified approach, more sophisticated methods may be needed)
new_audio = audio.fx(vfx.pitch, pitch_factor)
new_video = video.set_audio(new_audio)
output_path = "temp_audio_adjusted.mp4"
new_video.write_videofile(output_path, codec='libx264', audio_codec='aac')
return output_path
# Function to apply visual effects
def apply_visual_effects(input_video_path, glitch_effect, mirror_effect, black_and_white, sepia, blur, brightness):
video = VideoFileClip(input_video_path)
if glitch_effect:
# Simple glitch effect (you can enhance this by adding more complex glitches)
def glitch_clip(clip):
frames = []
for frame in clip.iter_frames(fps=clip.fps):
if np.random.rand() < 0.1: # Randomly flip some frames horizontally
frame = np.fliplr(frame)
frames.append(frame)
return clip.set_data(np.array(frames))
video = video.fl_image(lambda img: glitch_clip(video).get_frame(0))
if mirror_effect:
video = video.fx(vfx.mirror_x) # Mirror reflection along X-axis
if black_and_white:
video = video.fx(blackwhite)
if sepia:
# Apply sepia effect using a custom function
def sepia_effect(img):
sepia_filter = np.array([[0.393, 0.769, 0.189],
[0.349, 0.686, 0.168],
[0.272, 0.534, 0.131]])
sepia_img = np.dot(img[...,:3], sepia_filter.T)
sepia_img = np.clip(sepia_img, 0, 255).astype(np.uint8)
return sepia_img
video = video.fl_image(sepia_effect)
if blur:
video = video.fx(vfx.blur, blur_radius=5)
if brightness != 0:
video = video.fx(colorx, brightness)
output_path = "temp_visual_effects.mp4"
video.write_videofile(output_path, codec='libx264', audio_codec='aac')
return output_path
# Main function to handle all modifications
def edit_video(input_video, pitch_factor, glitch_effect, mirror_effect, black_and_white, sepia, blur, brightness):
temp_video = input_video.name if isinstance(input_video, gr.File) else input_video
# Step 1: Adjust audio pitch
temp_video = adjust_audio_pitch(temp_video, pitch_factor)
# Step 2: Apply visual effects
final_video = apply_visual_effects(temp_video, glitch_effect, mirror_effect, black_and_white, sepia, blur, brightness)
return final_video
# Create the Gradio Interface with a blue theme
with gr.Blocks(theme="default-blue") as demo:
gr.Markdown(
"""
# Neon Video Editor
A sleek and modern video editor with advanced features.
"""
)
with gr.Row():
with gr.Column():
input_video = gr.File(label="Upload Video", file_types=["video"])
pitch_factor = gr.Slider(label="Audio Pitch Adjustment", minimum=-20, maximum=20, value=0, step=0.1)
glitch_effect = gr.Checkbox(label="Apply Glitch Effect")
mirror_effect = gr.Checkbox(label="Apply Mirror Reflection")
black_and_white = gr.Checkbox(label="Apply Black & White Effect")
sepia = gr.Checkbox(label="Apply Sepia Effect")
blur = gr.Checkbox(label="Apply Blur Effect")
brightness = gr.Slider(label="Adjust Brightness", minimum=-1, maximum=1, value=0, step=0.1)
apply_button = gr.Button("Apply Changes")
with gr.Column():
output_video = gr.Video(label="Edited Video Preview")
apply_button.click(
fn=edit_video,
inputs=[input_video, pitch_factor, glitch_effect, mirror_effect, black_and_white, sepia, blur, brightness],
outputs=output_video
)
demo.launch()