| """ |
| Used to compress video in: https://github.com/ArrowLuo/CLIP4Clip |
| Author: ArrowLuo |
| """ |
| import os |
| import argparse |
| import ffmpeg |
| import subprocess |
| import time |
| import multiprocessing |
| from multiprocessing import Pool |
| import shutil |
| try: |
| from psutil import cpu_count |
| except: |
| from multiprocessing import cpu_count |
| |
|
|
| def compress(paras): |
| input_video_path, output_video_path = paras |
| try: |
| command = ['ffmpeg', |
| '-y', |
| '-i', input_video_path, |
| '-filter:v', |
| 'scale=\'if(gt(a,1),trunc(oh*a/2)*2,224)\':\'if(gt(a,1),224,trunc(ow*a/2)*2)\'', |
| '-map', '0:v', |
| '-r', '3', |
| output_video_path, |
| ] |
| ffmpeg = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
| out, err = ffmpeg.communicate() |
| retcode = ffmpeg.poll() |
| |
| except Exception as e: |
| raise e |
|
|
| def prepare_input_output_pairs(input_root, output_root): |
| input_video_path_list = [] |
| output_video_path_list = [] |
| for root, dirs, files in os.walk(input_root): |
| for file_name in files: |
| input_video_path = os.path.join(root, file_name) |
| output_video_path = os.path.join(output_root, file_name) |
| if os.path.exists(output_video_path) and os.path.getsize(output_video_path) > 0: |
| pass |
| else: |
| input_video_path_list.append(input_video_path) |
| output_video_path_list.append(output_video_path) |
| return input_video_path_list, output_video_path_list |
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser(description='Compress video for speed-up') |
| parser.add_argument('--input_root', type=str, help='input root') |
| parser.add_argument('--output_root', type=str, help='output root') |
| args = parser.parse_args() |
|
|
| input_root = args.input_root |
| output_root = args.output_root |
|
|
| assert input_root != output_root |
|
|
| if not os.path.exists(output_root): |
| os.makedirs(output_root, exist_ok=True) |
|
|
| input_video_path_list, output_video_path_list = prepare_input_output_pairs(input_root, output_root) |
|
|
| print("Total video need to process: {}".format(len(input_video_path_list))) |
| num_works = cpu_count() |
| print("Begin with {}-core logical processor.".format(num_works)) |
|
|
| pool = Pool(num_works) |
| data_dict_list = pool.map(compress, |
| [(input_video_path, output_video_path) for |
| input_video_path, output_video_path in |
| zip(input_video_path_list, output_video_path_list)]) |
| pool.close() |
| pool.join() |
|
|
| print("Compress finished, wait for checking files...") |
| for input_video_path, output_video_path in zip(input_video_path_list, output_video_path_list): |
| if os.path.exists(input_video_path): |
| if os.path.exists(output_video_path) is False or os.path.getsize(output_video_path) < 1.: |
| shutil.copyfile(input_video_path, output_video_path) |
| print("Copy and replace file: {}".format(output_video_path)) |