import os import sys import json import ffmpeg if sys.argv[1] == 'grid' or sys.argv[1] == 'file': mode = sys.argv[1] if (mode == 'grid'): cols = sys.argv[2] rows = sys.argv[3] inputpath = os.path.abspath(sys.argv[4]) outputdir = os.path.abspath(sys.argv[5]) if (mode == 'file'): layoutpath = os.path.abspath(sys.argv[2]) inputpath = os.path.abspath(sys.argv[3]) outputdir = os.path.abspath(sys.argv[4]) else: print('Videoshredder splits a video into multiple tiles') print('There are two layout input modes available: grid and file') print('') print('Examples:') print('') print('./video-shredder.py grid 4 3 path/to/inputfile.mp4 output_dirctory') print(' ... splits the video into 4x3 equally distributed tiles') print('') print('./video-shredder.py file layout.json path/to/inputfile.mp4 output_dirctory') print(' ... splits into tiles defined in the layout file') print('') exit() try: os.stat(outputdir) except: print('Creating new directory', outputdir) os.mkdir(outputdir) def generateGrid (source, h_tiles, v_tiles): probe = ffmpeg.probe(source) video = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None) width = int(video['width']) height = int(video['height']) layout = [] tile_width = width/int(h_tiles) tile_height = height/int(v_tiles) for row in range(int(v_tiles)): for col in range(int(h_tiles)): print('row col', row, col) layout.append( { "name": str(row+1) + "-" + str(col+1), "geomentry": { "x": str(tile_width*col).split('.')[0], "y": str(tile_height*row).split('.')[0], "width": str(tile_width).split('.')[0], "height": str(tile_height).split('.')[0] } }) return layout def processLayout (layout): print(layout) for item in layout: outputpath = os.path.join(outputdir, item["name"] + '.mp4') print('processing: ' +item["name"]) print(' input path: ' + inputpath) print(' output path: ' + outputpath) stream = ( ffmpeg .input(inputpath) .crop(**item['geomentry']) .output(outputpath, pix_fmt='yuv420p') .run() ) print('Finished processing all tiles!') print('Output directory: ' + str(outputdir)) if (mode == 'file'): with open(layoutpath, "r") as read_file: processLayout(json.load(read_file)) if (mode == 'grid'): layout = generateGrid(inputpath, cols, rows) processLayout(layout)