视频mp4垂直拼接 水平拼接
pinjie_v.py
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)
方法补充
下面小编为大家整理了python中视频拼接的示例代码,希望对大家有所帮助
#!/user/bin/env python # coding=utf-8 """ @project : csdn @author : 剑客阿良_aliang @file : concat_video.py @ide : pycharm @time : 2021-12-23 15:23:16 """ from ffmpy import ffmpeg import os import uuid import subprocess # 视频拼接 def concat(video_list: list, output_dir: str): if len(video_list) == 0: raise exception('video_list can not empty') _ext = check_format(video_list) _fps = check_fps(video_list) _result_path = os.path.join( output_dir, '{}{}'.format( uuid.uuid1().hex, _ext)) _tmp_config = make_tmp_concat_config(video_list, output_dir) ff = ffmpeg(inputs={'{}'.format(_tmp_config): '-f concat -safe 0 -y'}, outputs={ _result_path: '-c copy'}) print(ff.cmd) ff.run() os.remove(_tmp_config) return _result_path # 构造拼接所需临时文件 def make_tmp_concat_config(video_list: list, output_dir: str): _tmp_concat_config_path = os.path.join(output_dir, '{}.txt'.format(uuid.uuid1().hex)) with open(_tmp_concat_config_path, mode='w', encoding='utf-8') as f: f.writelines(list(map(lambda x: 'file {}\n'.format(x), video_list))) return _tmp_concat_config_path # 校验每个视频的格式 def check_format(video_list: list): _video_format = '' for x in video_list: _ext = os.path.splitext(x)[-1] if _video_format == '' and _ext != '': _video_format = _ext continue if _video_format != '' and _ext == _video_format: continue if _video_format != '' and _ext != _video_format: raise exception('inconsistent video format') return _video_format # 校验每个视频的fps def check_fps(video_list: list): _video_fps = 0 for x in video_list: _fps = get_video_fps(x) if _video_fps == 0 and _fps: _video_fps = _fps continue if _video_fps != 0 and _fps == _video_fps: continue if _video_fps != '' and _fps != _video_fps: raise exception('inconsistent video fps') if _video_fps == 0: raise exception('video fps error') return _video_fps # 获取视频fps def get_video_fps(video_path: str): ext = os.path.splitext(video_path)[-1] if ext != '.mp4' and ext != '.avi' and ext != '.flv': raise exception('format not support') ffprobe_cmd = 'ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate {}' p = subprocess.popen( ffprobe_cmd.format(video_path), stdout=subprocess.pipe, stderr=subprocess.pipe, shell=true) out, err = p.communicate() print("subprocess 执行结果:out:{} err:{}".format(out, err)) fps_info = str(out, 'utf-8').strip() if fps_info: if fps_info.find("/") > 0: video_fps_str = fps_info.split('/', 1) fps_result = int(int(video_fps_str[0]) / int(video_fps_str[1])) else: fps_result = int(fps_info) else: raise exception('get fps error') return fps_result if __name__ == '__main__': print(concat(['d:/tmp/100.mp4', 'd:/tmp/101.mp4'], 'c:/users/huyi/desktop'))
到此这篇关于python实现视频mp4垂直和水平拼接的文章就介绍到这了,更多相关python视频拼接内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论