视频mp4垂直拼接 水平拼接
pinjie_v.py
python">import imageio
import numpy as np
import os
import cv2
def pinjie_v(dir1,dir2,out_dir):
os.makedirs(out_dir, exist_ok=True)
# 获取目录下的所有视频文件
video_files_1 = [f for f in os.listdir(dir1) if f.endswith('.mp4')]
video_files_2 = [f for f in os.listdir(dir2) if f.endswith('.mp4')]
# 确保两个目录下的视频文件是同名的
common_files = set(video_files_1).intersection(video_files_2)
# 如果没有同名视频,退出
if not common_files:
print("没有同名的视频文件。")
exit()
for video_name in common_files:
print(f"处理视频: {video_name}")
# if "user-4fd103ee-38d4-43c5-bb2a-f496d2fe065e" not in video_name:
# continue
# 打开视频文件
video_path_1 = os.path.join(dir1, video_name)
video_path_2 = os.path.join(dir2, video_name)
reader1 = imageio.get_reader(video_path_1)
reader2 = imageio.get_reader(video_path_2)
# 获取视频信息(假设两个视频有相同帧数)
fps = reader1.get_meta_data()['fps']
num_frames = min(reader1.count_frames(), reader2.count_frames())
# 创建输出文件
output_path = os.path.join(out_dir, f"v_{video_name}")
# writer = imageio.get_writer(output_path, fps=fps)
if os.path.exists(output_path):
continue
outs = []
# 逐帧处理
for i in range(num_frames):
frame1 = reader1.get_data(i)
frame2 = reader2.get_data(i)
# 获取帧的高度和宽度
height1, width1, _ = frame1.shape
height2, width2, _ = frame2.shape
if height1 > width1:
if height1 != height2:
y_scale = height1 / height2
frame2 = cv2.resize(frame2, (int(width2 * y_scale), height1), interpolation=cv2.INTER_AREA)
elif height1 <= width1:
if width1 != width2:
x_scale = width1 / width2
frame2 = cv2.resize(frame2, (width1, int(height2 * x_scale)), interpolation=cv2.INTER_AREA)
if height1 > width1:
frame = np.hstack([frame1, frame2])
else:
frame = np.vstack([frame1, frame2])
outs.append(frame)
try:
imageio.mimsave(f'{output_path}', outs, fps=fps, macro_block_size=None)
except Exception as e:
print(e)
# writer.close()
print(f"视频 {video_name} 拼接完成,保存在 {output_path}")
if __name__ == '__main__':
# 设置目录路径
dir1 = r'E:\project\smpl\render_blender\linux\hmr_res'
dir2 = r'E:\project\smpl\render_blender\linux\hmr2_res'
dir1 = r'E:\project\smpl\render_blender\linux\val_out_depth_any_color'
dir2 = r'E:\project\smpl\render_blender\linux\val_out_video'
dir1 = r'E:\project\smpl\render_blender\linux\val_out_depth_any_color'
dir2 = r'E:\project\smpl\render_blender\linux\val_out_video'
dir1=r'E:\project\smpl\render_blender\linux\test_lbg_o'
dir2 =r'E:\project\smpl\render_blender\linux\test_lbg6'
out_dir = 'track_diff'
pinjie_v(dir1,dir2,out_dir)