import os import subprocess import sys def extract_audio(video_path, output_path=None): """ Extracts audio from a video file using ffmpeg. Args: video_path (str): Path to the input video file. output_path (str, optional): Path for the output audio file. If None, defaults to same name with .wav extension. Returns: str: Path to the generated audio file. """ if not os.path.exists(video_path): raise FileNotFoundError(f"Video file not found: {video_path}") if output_path is None: base_name = os.path.splitext(video_path)[0] output_path = f"{base_name}.wav" # Check if output file already exists to avoid redundant processing if os.path.exists(output_path): print(f"Audio file already exists: {output_path}") return output_path print(f"Extracting audio from {video_path}...") # Command matching the user's preferred settings: 16kHz, Mono, PCM s16le # -y overwrites without asking (though we checked existence above, this is for safety if we force it) command = [ "ffmpeg", "-i", video_path, "-ar", "16000", "-ac", "1", "-c:a", "pcm_s16le", "-y", "-v", "error", # Less verbose output_path ] try: subprocess.run(command, check=True) print(f"Audio extracted to: {output_path}") return output_path except subprocess.CalledProcessError as e: print(f"Error extracting audio: {e}") sys.exit(1) def embed_subtitles(video_path, srt_path, output_path=None): """ Embeds subtitles into the video file (Soft Subs) and sets them as primary. Args: video_path (str): Path to the input video. srt_path (str): Path to the SRT file. output_path (str, optional): Path for the output video. """ if not os.path.exists(video_path) or not os.path.exists(srt_path): print("Error: Video or SRT file not found for embedding.") return if output_path is None: base, ext = os.path.splitext(video_path) output_path = f"{base}.subbed{ext}" print(f"Embedding subtitles into: {output_path}...") # Determine subtitle codec based on container sub_codec = "mov_text" if video_path.lower().endswith(".mp4") else "srt" # Command breakdown: # -map 0:v -map 0:a -> Keep all video and audio from source # -map 1:0 -> Add the subtitle from the 2nd input (srt_path) # -c copy -> Copy video/audio streams (no re-encoding) # -disposition:s:0 default -> Make the first subtitle track (ours) the default # -metadata:s:s:0 -> Set metadata for the first subtitle stream command = [ "ffmpeg", "-i", video_path, "-i", srt_path, "-map", "0:v", "-map", "0:a", "-map", "1:0", "-c", "copy", "-c:s", sub_codec, "-disposition:s:0", "default", "-metadata:s:s:0", "language=eng", "-metadata:s:s:0", "title=English (AI Translated)", "-y", "-v", "error", output_path ] try: subprocess.run(command, check=True) print(f"Subtitles embedded successfully: {output_path} (Set as primary)") except subprocess.CalledProcessError as e: print(f"Error embedding subtitles: {e}")