首页 > 编程语言 >Python视频混剪代码

Python视频混剪代码

时间:2024-05-16 16:29:59浏览次数:18  
标签:视频 Python 混剪 video output input os 目录 dir

公司需要剪辑,近期混剪特别多,所以开发了这个,有兴趣的研究研究,如果有好的代码补充优化或者分享麻烦艾特我

`import os
import hashlib
import threading
import random
import threading
import moviepy.editor as mpy
from moviepy.editor import AudioFileClip, VideoFileClip, concatenate_videoclips
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor
from lxml import etree
import requests

初始化函数

def initialize():
# 检查目录分级,不存在就创建
if not os.path.exists("素材目录"):
os.makedirs("素材目录", exist_ok=True)
if not os.path.exists("素材目录/半成品目录"):
os.makedirs("素材目录/半成品目录", exist_ok=True)
if not os.path.exists("素材目录/查重目录"):
os.makedirs("素材目录/查重目录", exist_ok=True)
if not os.path.exists("素材目录/成品目录"):
os.makedirs("素材目录/成品目录", exist_ok=True)
if not os.path.exists("素材目录/纯音乐"):
os.makedirs("素材目录/纯音乐", exist_ok=True)
if not os.path.exists("素材目录/音乐目录"):
os.makedirs("素材目录/音乐目录", exist_ok=True)

功能菜单选择函数

def menu_selection():
print("功能选择提示与输入:")
print("功能 1:视频自动混剪")
print("功能 2:添加随机 bgm")
print("功能 3:视频查重")
print("功能 4:敬请期待")
print("功能 5:退出程序")
return int(input("请输入要执行的功能编号:"))

混剪线程

def auto_video_mix(input_dir, output_dir, num_parts=2, num_videos=1):
# 创建分镜目录列表
parts = []
for i in range(1, num_parts + 1):
part = f"分镜{i}"
parts.append(part)
print("分镜头合并顺序如下:\n" + str(parts))

with ThreadPoolExecutor(max_workers=4) as executor:
    for i in range(num_videos):
        executor.submit(merge_and_save_video, output_dir, i)

混剪程序

def merge_and_save_video(output_path, i):
# 选择每个分镜头中的一个视频
parts = []
for j in range(1, num_parts + 1):
part = f"素材目录/分镜目录/分镜{j}"
parts.append(part)
selected_videos = []
for folder in parts:
videos_in_folder = [os.path.join(folder, video) for video in os.listdir(folder)]
selected_video = random.choice(videos_in_folder)
selected_videos.append(selected_video)
# 合并视频
clips = [VideoFileClip(video) for video in selected_videos]
merged_clip = concatenate_videoclips(clips)

# 保存合并后的视频
merged_video_path = f"{output_path}/{datetime.now().strftime('%m%d')}_{i}.mp4"
merged_clip.write_videofile(merged_video_path)

添加随机 bgm 函数线程

def add_random_bgm(input_dir, output_dir, music_dir):
with ThreadPoolExecutor(max_workers=4) as executor:
videos_in_folder = [os.path.join(input_dir, video) for video in os.listdir(input_dir)]
for i in range(len(videos_in_folder)):
executor.submit(combine_music_and_video, input_dir, music_dir, output_dir, i)

添加随机 bgm 函数程序

def combine_music_and_video(input_dir, music_dir, output_dir, i):
# 随机选择一个音乐文件
music_file = random.choice(os.listdir(music_dir))
# 加载音乐和视频
music = mpy.AudioFileClip(os.path.join(music_dir, music_file))
videos_in_folder = [os.path.join(input_dir, video) for video in os.listdir(input_dir)]
# print(videos_in_folder[i])
semi_finished_video = mpy.VideoFileClip(os.path.join(videos_in_folder[i]))
# 截取音乐与视频长度一致的片段
music_duration = semi_finished_video.duration
start_time = random.uniform(20, music.duration - music_duration)

music_clip = music.subclip(start_time, start_time + music_duration)

# 合成视频和音乐
final_video = semi_finished_video.set_audio(music_clip)
# 生成文件名
now = datetime.now()
formatted_date = now.strftime("%m-%d")
filename = f"{formatted_date}_纯音乐_{i}.mp4"

# 保存合成后的视频到成品文件夹
final_video.write_videofile(os.path.join(output_dir, filename), fps=semi_finished_video.fps)

哈希查重函数

def hash_check(input_dir, threshold):
# 获取输入目录下的所有文件
files = os.listdir(input_dir)

# 创建输出文件列表
output_files = []
for file in files:
    output_file = f"{input_dir}/{file}_C_{hashlib.md5(open(file, 'rb').read()).hexdigest()}"
    output_files.append(output_file)

# 启动线程进行哈希计算
threads = []
for i in range(len(output_files)):
    thread = threading.Thread(target=check_hash, args=(output_files[i]))
    threads.append(thread)
    thread.start()

# 等待所有线程完成
for thread in threads:
    thread.join()

# 输出重复率大于阈值的文件列表
print("重复率大于阈值的文件:")
for file in output_files:
    if os.path.exists(file):
        print(file)

def verify():
url = "https://docs.qq.com/doc/DTkZuYUlXT3dnRmVr"

# 发送 HTTP 请求获取网页内容
response = requests.get(url)

# 将响应内容转换为 HTML 树
html_tree = etree.HTML(response.text)

# 根据 XPath 获取特定元素的值
target_value = html_tree.xpath('/html/head/title/text()')[0]  # 替换为实际的 XPath 表达式

return target_value

主程序

if name == "main":

print("开始网络验证,请稍等")
a = verify()
if a == "1":
    print("验证通过,小疯还在职")
else:
    input("验证失败,小疯已离职")
    exit()
initialize()

while True:
    choice = menu_selection()

    if choice == 1:
        input_dir = f"素材目录/分镜目录"
        output_dir = "素材目录/半成品目录"
        num_parts = int(input("请输入分镜目录的数量:"))
        for i in range(1, num_parts + 1):
            os.makedirs(f"素材目录/分镜目录/分镜{i}", exist_ok=True)
        num_videos = int(input("请输入要合成的视频数量:"))
        auto_video_mix(input_dir, output_dir, num_parts, num_videos)
    elif choice == 2:
        music_dir = "素材目录/音乐目录"
        input_dir = "素材目录/半成品目录"
        output_dir = "素材目录/纯音乐"
        add_random_bgm(input_dir, output_dir, music_dir)
    elif choice == 3:
        input_dir = "素材目录/查重目录"
        threshold = float(input("请输入重复率阈值:"))
        hash_check(input_dir, threshold)
    elif choice == 4:
        print("敬请期待")
    elif choice == 5:
        exit()

`

标签:视频,Python,混剪,video,output,input,os,目录,dir
From: https://www.cnblogs.com/ruler-madman/p/18196209

相关文章

  • ComfyUi使用SVD-图片变视频
    模型地址国内下载https://www.modelscope.cn/models/cjc1887415157/stable-video-diffusion-img2vid-xt-1-1/files下载完放到ComfyUI\models\checkpoints工作流导入https://pan.baidu.com/s/1MFtYIHeI65lqt_sC8gLqLA?pwd=ul99#list/path=%2Fsharelink3518560115-73741697408......
  • python计算时间
       importtimeimportdatetimedefcompare_time(startTime,endTime):#now=datetime.datetime.now()d_start=datetime.datetime.strptime(startTime,'%Y-%m-%d%H:%M:%S')d_end=datetime.datetime.strptime(endTime,'%Y-%m-%......
  • python算法:详细图解: 排序:冒泡排序
    一,什么是冒泡排序?1,冒泡排序和快速排序都属于交换排序所谓交换,就是对序列中两个元素根据键值的比较结果来对换这两个记录在序列中的位置交换排序的特点:将键值较大的元素向序列的尾部移动,键值较小的元素向序列的前部移动2,冒泡排序:BubbleSort,是一种最基础的交换排序,冒泡排......
  • python算法:阿米巴分裂
    一,阿米巴分裂的题目:阿米巴虫用简单分裂的方式繁殖,它每分裂一次要用3分钟,3分钟后会分裂成为2只。将若干个阿米巴放在一个盛满营养液的容器内,45分钟后容器内充满了阿米巴。已知容器最多能够装220只阿米巴。试问,开始的时候往容器内放了多少个阿米巴?二,解析一:分析:已知45......
  • python算法:打字员问题
    一,题目:现有一堆稿件,甲单独打字完成需要6小时,乙单独打字完成需要10小时,甲工作了若干小时后因家中有事由乙接着干,两人完成稿件一共用了7小时,问甲打字用了几个小时?二,解析:1,为了方便计算,我们假设这堆稿件分成60份,可以得到:甲每小时打10份,乙每小时打6份,设甲用时x,取值范围:[......
  • python算法:篮球联赛
    一,篮球联赛题目某大学举办一次全校学生篮球联赛,全校共n支球队,采用单循环制(每两支队之间比赛一场),一共需要进行多少场比赛?二,解析:思路:我们假设按出场顺序进行比赛只有第一个队时,无法比赛第二个队出场时,与1队比赛一场,可得:f(2)=1第三个队出场时,与1队,2队各比赛一场,可以得到......
  • python3.8下载过程
    python网址:https://www.python.org/ 下载——————————————选downloads下的windows 稍微等待一会后进入此界面 向下滑,找到3.8.0(python版本并不是按顺序排列的) 选择适合自己的版本下载——————其中X86适用于32系统,X86-64适合64的web-based:透过网......
  • python算法:握手问题
    一,题目小明在家中举办派对,请邀请好友来参加,来参加宴会的每两个人之间要握手,而且是仅握手一次,则当人数为n时总共需要握手多少次?二,解析1,思路:我们假设每个人到达后按先后顺序握手:这样从人数最少时开始分析:开始时会场中只有小明,是参会的第一个人,假设第二个人到达时,与小明握......
  • python算法:常胜将军
    一,题目有火柴21根,两人依次取,每次每人只可取走1~4根,不能多取,也不能不取,谁取到最后一根火柴谁输。请编写一个人机对弈程序,要求人先取,计算机后取;计算机为“常胜将军”。二,解析要想让计算机是“常胜将军”,就需要让人取到最后一根火柴。这个怎么实现?就是在倒数第二轮时计算机只剩......
  • python算法:求车速
    一,for循环:1,功能:重复执行同一段代码语法:forindexinrange(n):   #循环体代码index:用来依次接收可迭代对象中的元素的变量名range()函数:负责返回整数序列流程图:2,应用range可以同时指定start和stop,用for遍历并打印1234#指定start和s......