image and audio mix, video prepare.
---------------
!pip install yt-dlp moviepy ffmpeg-python
import yt_dlp
from moviepy.editor import ImageClip, AudioFileClip
import glob, os
# -------- USER INPUTS --------
image_file = "/content/ima1.png" # your image
audio_url = "https://www.youtube.com/watch?v=me8uai5nV9c" # audio url
audio_start = "39:03" # mm:ss (example wrong input)
audio_end = "39:30" # mm:ss
output_path = "/content/output.mp4"
# -----------------------------
def download_from_youtube(url, filename, audio_only=True):
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': filename + ".%(ext)s",
'quiet': False,
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
def time_to_seconds(t):
mm, ss = t.split(":")
return int(mm) * 60 + int(ss)
# Download audio
download_from_youtube(audio_url, "/content/audio", audio_only=True)
audio_files = glob.glob("/content/audio.*")
audio_file = audio_files[0]
# Load full audio first
full_audio = AudioFileClip(audio_file)
print(f"🎵 Downloaded audio duration: {full_audio.duration:.2f} sec ({full_audio.duration/60:.1f} min)")
# Convert input times
a_start = time_to_seconds(audio_start)
a_end = time_to_seconds(audio_end)
# Safety check: clamp to available duration
if a_start >= full_audio.duration:
print("⚠️ Start time is beyond audio length. Resetting to 0.")
a_start = 0
if a_end > full_audio.duration:
print("⚠️ End time is beyond audio length. Resetting to end of audio.")
a_end = full_audio.duration
# Trim audio
audio_clip = full_audio.subclip(a_start, a_end)
# Make static image into a video
image_clip = ImageClip(image_file, duration=audio_clip.duration)
# Set audio
final_clip = image_clip.set_audio(audio_clip)
# Export
final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac", fps=24)
print(f"✅ Final video saved as {output_path}")