import multiprocessing as mp
import os
import subprocess
from pyskl.smp import *
def get_shape(vid):
cmd = 'ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 \"{}\"'.format(vid)
w, h = subprocess.check_output(cmd, shell=True).decode('utf-8').split('x')
return int(w), int(h)
def compress(src, dest, shape=None, target_size=540, fps=-1):
if shape is None:
shape = get_shape(src)
w, h = shape
scale_str = f'-vf scale=-2:{target_size}' if w >= h else f'-vf scale={target_size}:-2'
fps_str = f'-r {fps}' if fps > 0 else ''
quality_str = '-q:v 1'
vcodec_str = '-c:v libx264'
cmd = f'ffmpeg -y -loglevel error -i {src} -threads 1 {quality_str} {scale_str} {fps_str} {vcodec_str} {dest}'
os.system(cmd)
def compress_nturgbd(name):
src = name
dest = src.replace('nturgbd_raw', 'nturgbd_videos').replace('_rgb.avi', '.mp4')
shape = (1920, 1080)
compress(src, dest, shape)
os.makedirs('../../../autodl-tmp/nturgbd_videos', exist_ok=True)
files = ls('../../../autodl-tmp/nturgb+d_rgb', match='.avi')
pool = mp.Pool(32)
pool.map(compress_nturgbd, files)
第一点:需要安装ffmpeg工具包
conda install ffmpeg
第二点:需要改路径
os.makedirs('../../../autodl-tmp/nturgbd_videos', exist_ok=True)
files = ls('../../../autodl-tmp/nturgb+d_rgb', match='.avi')
可以来分析一下
compress_nturgbd.py位于rgbpose_conv3d文件夹下面,所以rgbpose_conv3d是当前目录
../表示上一级目录,也就是到configs文件夹表示上一级目录
configs/rgbpose_conv3d/compress_nturgbd.py
../../表示上一级目录的上一级目录,也就是到pyskl文件夹
pyskl/configs/rgbpose_conv3d/compress_nturgbd.py
../../../表示上一级目录的上一级目录的上一级目录,也就是到root文件夹
root/pyskl/configs/rgbpose_conv3d/compress_nturgbd.py
也就是到root文件夹下面开始寻找autodl-tmp文件夹,继续寻找nturgbd_videos文件夹。
到root文件夹下面开始寻找autodl-tmp文件夹,继续寻找nturgb+d_rgb文件夹。
第三点:需要修改下面这一行代码
dest = src.replace('nturgbd_raw', 'nturgbd_videos').replace('_rgb.avi', '.mp4')
修改为
dest = src.replace('nturgb+d_rgb', 'nturgbd_videos').replace('_rgb.avi', '.mp4')
这行如果不修改的话,压缩之后的.mp4结尾的视频,会输出到和源视频一样的路径。
这样.mp4结尾的视频和.avi结尾的视频会混合到一起。
参考:
https://github.com/kennymckormick/pyskl/blob/main/configs/rgbpose_conv3d/compress_nturgbd.py