test / preprocess /compress_video.py
jaewooo's picture
Initial upload
de15dc5 verified
"""
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
# multiprocessing.freeze_support()
def compress(paras):
input_video_path, output_video_path = paras
try:
command = ['ffmpeg',
'-y', # (optional) overwrite output file if it exists
'-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)\'', # scale to 224
'-map', '0:v',
'-r', '3', # frames per second
output_video_path,
]
ffmpeg = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = ffmpeg.communicate()
retcode = ffmpeg.poll()
# print something above for debug
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))