from moviepy.editor import *
from moviepy.video.tools.subtitles import SubtitlesClip
import numpy as np
# 1. 初始化参数
W, H = 1080, 1920 # 竖屏尺寸
DURATION = 60 # 总时长60秒
BG_MUSIC = "suspense_music.mp3" # 背景音乐文件
# 2. 加载素材(实际使用时需替换为真实素材路径)
# 假设已下载好相关片段
clips = {
"bloody_scream": VideoFileClip("bloody_scream.mp4").subclip(0,3),
"tomb_scene": VideoFileClip("tomb_push.mp4").subclip(0,4),
"carriage": VideoFileClip("carriage_scheme.mp4").subclip(0,4),
"puzzle": VideoFileClip("jade_puzzle.mp4").subclip(0,4),
"smile_cry": VideoFileClip("acting_contrast.mp4").subclip(0,15),
"reversals": [VideoFileClip("suicide.mp4"), VideoFileClip("blood_spurt.mp4"), VideoFileClip("dagger_throat.mp4")],
"finale": VideoFileClip("black_robe_turn.mp4").subclip(0,15)
}
# 3. 创建字幕生成器
def text_effect(txt, fontsize=60, color='yellow', stroke_color='black', stroke_width=2):
return TextClip(txt, fontsize=fontsize, color=color, font='SimHei',
stroke_color=stroke_color, stroke_width=stroke_width,
size=(W*0.9, None), method='caption').set_position('center')
# 4. 构建时间轴
final_clips = []
# === 0-3秒:开场钩子 ===
bloody_scene = clips["bloody_scream"].resize((W,H))
bloody_scene = bloody_scene.without_audio() # 原片静音
heartbeat = AudioFileClip("heartbeat.wav").set_start(0)
final_clips.append(bloody_scene.set_audio(heartbeat))
# 添加爆炸字幕
title_text = CompositeVideoClip([
text_effect("开播38小时破万热度!", 70).set_position(("center", H*0.7)),
text_effect("年度剧王杀疯了!", 80).set_position(("center", H*0.8))
]).set_duration(3).crossfadein(0.5)
final_clips.append(title_text)
# === 4-15秒:三大高能场面快剪 ===
action_clips = [
clips["tomb_scene"].resize((W/2-10, H/2-10)).set_position(("left", "top")),
clips["carriage"].resize((W/2-10, H/2-10)).set_position(("right", "top")),
clips["puzzle"].resize((W/2-10, H/2-10)).set_position(("left", "bottom")),
ImageClip("map_bg.jpg").resize((W,H)).set_duration(12)
]
action_montage = CompositeVideoClip(action_clips, size=(W,H)).set_duration(12).set_start(3)
# 添加动态字幕
subtitles = [
(4, "灭门稚奴变身藏海归来!"),
(6, "零武力值复仇天花板!"),
(8, "堪舆之术破死局"),
(10, "机关算尽诛仇敌!")
]
sub_clips = []
for start, txt in subtitles:
sub = text_effect(txt, 65).set_start(start).set_duration(2)
sub_clips.append(sub)
action_montage = CompositeVideoClip([action_montage] + sub_clips)
final_clips.append(action_montage)
# === 16-30秒:演技对比 ===
acting_clip = clips["smile_cry"].resize((W,H)).set_start(15)
# 添加分屏特效
mask_left = ImageClip("half_mask.png", ismask=True).resize((W,H))
split_screen = CompositeVideoClip([
acting_clip.set_mask(mask_left),
acting_clip.set_mask(mask_left.fl_image(lambda x: 1-x)).set_position((W/2,0))
])
final_clips.append(split_screen)
# 添加评分标签
rating_tag = (
TextClip("豆瓣8.5! 央媒认证电影级质感", fontsize=50, color='white',
bg_color='red', size=(W,100))
.set_position(("center", "top"))
.set_duration(15)
.set_start(15)
)
final_clips.append(rating_tag)
# === 31-45秒:终极反转三连击 ===
reversal_clips = []
for i, clip in enumerate(clips["reversals"]):
clip = clip.resize((W,H)).set_start(30+i*5).set_duration(4)
# 添加鲜血特效(最后一个镜头)
if i == 1:
blood_effect = ImageClip("blood_splash.png", duration=1).set_start(36).resize((W,H))
reversal_clips.append(blood_effect)
reversal_clips.append(clip)
# 悬念字幕
suspense_text = (
text_effect("点击看终极BOSS现身!", 80, color='red')
.set_start(42)
.set_duration(3)
.fx(vfx.fadein, 0.5)
)
final_clips.extend(reversal_clips)
final_clips.append(suspense_text)
# === 46-60秒:结尾悬念 ===
final_scene = clips["finale"].resize((W,H)).set_start(45)
# 添加童年照片闪现效果
child_photo = (
ImageClip("childhood.jpg")
.resize((W/3, H/3))
.set_position(("center", "center"))
.set_duration(0.3)
.set_start(54)
)
# 玻璃破碎音效
glass_break = AudioFileClip("glass_break.wav").set_start(54)
final_clips.append(final_scene.set_audio(glass_break))
final_clips.append(child_photo)
# 添加互动引导文字
interactive_text = [
"你以为复仇结束?藏海最终竟为仇人之子卖命!",
"追剧人速评:你猜中第三仇人是谁了吗?🔥",
"→ 关注解锁肖战黑化全cut"
]
text_clips = []
for i, txt in enumerate(interactive_text):
y_pos = 0.6 + i*0.1
clip = text_effect(txt, 55 if i<2 else 70,
color='cyan' if i<2 else 'yellow')
clip = clip.set_position(("center", y_pos*H)).set_start(48+i*2)
text_clips.append(clip)
final_clips.extend(text_clips)
# 5. 合成最终视频
final_video = CompositeVideoClip(final_clips, size=(W,H)).set_duration(DURATION)
# 6. 添加背景音乐和音效
drum_sound = AudioFileClip("war_drum.wav").volumex(0.7).set_start(3)
suspense_music = AudioFileClip(BG_MUSIC).volumex(0.4).set_start(0)
final_audio = CompositeAudioClip([drum_sound, suspense_music, final_video.audio])
final_video = final_video.set_audio(final_audio)
# 7. 输出视频
final_video.write_videofile(
"藏海传爆款剪辑.mp4",
fps=24,
codec='libx264',
audio_codec='aac',
threads=8,
preset='slow',
bitrate='8000k'
)