1 changed files with 100 additions and 0 deletions
@ -0,0 +1,100 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
|
||||
|
## chmod +x vidsplit |
||||
|
## sudo cp vidsplit /usr/local/bin |
||||
|
## vidsplit --help |
||||
|
|
||||
|
import os |
||||
|
import subprocess |
||||
|
import argparse |
||||
|
import sys |
||||
|
|
||||
|
def get_file_extension(file_path): |
||||
|
"""Extract the file extension from the input file.""" |
||||
|
return os.path.splitext(file_path)[1].lower() |
||||
|
|
||||
|
def get_duration(input_file): |
||||
|
"""Get the total duration of the video in seconds.""" |
||||
|
cmd = [ |
||||
|
"ffprobe", "-i", input_file, "-show_entries", "format=duration", |
||||
|
"-v", "quiet", "-of", "default=noprint_wrappers=1:nokey=1" |
||||
|
] |
||||
|
try: |
||||
|
duration = float(subprocess.check_output(cmd, stderr=subprocess.PIPE).decode().strip()) |
||||
|
return duration |
||||
|
except subprocess.CalledProcessError as e: |
||||
|
print(f"Error getting duration: {e}") |
||||
|
sys.exit(1) |
||||
|
|
||||
|
def split_video(input_file, size_limit_mb, output_dir): |
||||
|
"""Split the video into chunks based on size limit.""" |
||||
|
# Supported video extensions |
||||
|
valid_extensions = {'.mp4', '.avi', '.mkv', '.mov'} |
||||
|
file_ext = get_file_extension(input_file) |
||||
|
|
||||
|
if file_ext not in valid_extensions: |
||||
|
print(f"Error: Unsupported file type '{file_ext}'. Supported types: {', '.join(valid_extensions)}") |
||||
|
sys.exit(1) |
||||
|
|
||||
|
# Convert size limit to bytes |
||||
|
size_limit = size_limit_mb * 1000000 |
||||
|
|
||||
|
# Ensure output directory exists |
||||
|
os.makedirs(output_dir, exist_ok=True) |
||||
|
|
||||
|
# Extract basename |
||||
|
basename = os.path.splitext(os.path.basename(input_file))[0] |
||||
|
|
||||
|
# Get total duration |
||||
|
total_duration = get_duration(input_file) |
||||
|
print(f"Total duration: {total_duration:.2f} seconds") |
||||
|
|
||||
|
cur_duration = 0 |
||||
|
i = 1 |
||||
|
|
||||
|
while cur_duration < total_duration: |
||||
|
output_file = os.path.join(output_dir, f"{basename}-{i}{file_ext}") |
||||
|
ffmpeg_cmd = [ |
||||
|
"ffmpeg", "-ss", str(cur_duration), "-i", input_file, |
||||
|
"-fs", str(size_limit), "-c", "copy", "-y", output_file |
||||
|
] |
||||
|
|
||||
|
try: |
||||
|
result = subprocess.run(ffmpeg_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) |
||||
|
if result.returncode != 0: |
||||
|
print(f"Error splitting chunk {i}: {result.stderr}") |
||||
|
sys.exit(1) |
||||
|
except subprocess.CalledProcessError as e: |
||||
|
print(f"Error splitting chunk {i}: {e}") |
||||
|
sys.exit(1) |
||||
|
|
||||
|
# Get duration of the new chunk |
||||
|
chunk_duration = get_duration(output_file) |
||||
|
cur_duration += chunk_duration |
||||
|
print(f"Created chunk {i} ({cur_duration:.2f}/{total_duration:.2f} seconds processed)") |
||||
|
i += 1 |
||||
|
|
||||
|
print("Splitting complete!") |
||||
|
|
||||
|
def main(): |
||||
|
parser = argparse.ArgumentParser(description="Split a video file into chunks based on size limit.") |
||||
|
parser.add_argument("input_file", help="Path to the input video file") |
||||
|
parser.add_argument("output_dir", help="Directory to store the split video files") |
||||
|
parser.add_argument("--size", type=float, default=110, help="Size limit for each chunk in MB (default: 110)") |
||||
|
|
||||
|
args = parser.parse_args() |
||||
|
|
||||
|
# Validate input file |
||||
|
if not os.path.isfile(args.input_file): |
||||
|
print(f"Error: Input file '{args.input_file}' does not exist") |
||||
|
sys.exit(1) |
||||
|
|
||||
|
# Validate size limit |
||||
|
if args.size <= 0: |
||||
|
print("Error: Size limit must be a positive number") |
||||
|
sys.exit(1) |
||||
|
|
||||
|
split_video(args.input_file, args.size, args.output_dir) |
||||
|
|
||||
|
if __name__ == "__main__": |
||||
|
main() |
||||
Loading…
Reference in new issue