|
|
""" |
|
|
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)) |