大家好,我是大明哥,目前专注 AI 智能体。我的教程《大明哥 AI 觉醒社 | AI 智能体》正在免费开放中,如果想学习AI 智能体,请加大明哥微信(daming091),免费领取教程
这是大明哥《100 个 Coze 精品案例》的第 009个案例:抖音爆款星座 IP 混剪视频。
在前面两篇文章《抖音爆款星座 IP 视频,每条点赞 10000+,用 Coze 工作流轻松复制!》和《Coze 全自动情感治愈视频混剪。用 Coze 工作流帮您节约 99% 的时间,从此告别手动!》。一篇是生成星座 IP 视频,一条是情感治愈视频混剪。其实在下图中,该博主最近的视频都是混剪,所以这里就来实现下星座 IP 混剪视频。
视频效果:
整体思路
- 文案、星座图片、音频和抖音爆款星座 IP 视频,每条点赞 10000+,用 Coze 工作流轻松复制!一样,没有什么改动。唯一的改动点就在于视频的处理上面,不再是固定的背景视频了,而是从一堆视频里面挑选一些。
完整流程图:
执行过程:
搭建工作流
整个工作流和抖音爆款星座 IP 视频,每条点赞 10000+,用 Coze 工作流轻松复制!有 80% 的相同之处,大明哥只介绍不同的地方:处理视频。即下图:
由于支持自定义视频,所以在开始节点会多一个参数:
这样在获取视频时就需要判断用户是否已上传了视频,如果上传了则需要先获取视频的时长,也就是这段:
在筛选视频时,需要传入三个参数:
input_video_list
:用户输入视频input_video_duration
:用户输入视频时长audio_duration
:音频时长。这里是需要保证整个视频时长和音频时长一致再就是代码处理了:
import randomimport mathasync def main(args: Args) -> Output: params = args.params input_video_list = params["input_video_list"] input_video_duration = params["input_video_duration"] audio_duration = params["audio_duration"] # 计算总时长 max_video_duration = 2000000 max_audio_duration = 0 for duration in audio_duration: max_video_duration += duration["duration"] max_audio_duration += duration["duration"] video_url_list = [] if input_video_list: video_url_list.extend(input_video_list) video_duration = 0 if input_video_duration: for video in input_video_duration: duration = video["data"]["duration"] video_duration += duration # 判断用户输入的视频是否够文案长度 diff_duration = max_video_duration - video_duration * 1000000 if diff_duration > 0: clip_duration = 6 * 1000000 total_duration = math.ceil(diff_duration) video_num = total_duration // clip_duration if total_duration % clip_duration != 0: video_num += 2 ## 获取随机视频 random_video = get_random_videos(video_num) video_url_list.extend(random_video) # 开场音效 open_audio_url = ["https://sike.skjava.com/ai/1748396216512_ojzmqyqa0t.mp3"] # 构建输出对象 ret: Output = { "video_url_list": video_url_list, "max_video_duration":max_video_duration, "max_audio_duration":max_audio_duration, "open_audio_url":open_audio_url } return ret# 随机挑选视频def get_random_videos(num): video_urls = [ "https://sike.skjava.com/ai-sucai/xxxx.mp4", "https://sike.skjava.com/ai-sucai/xxxx.mp4", "https://sike.skjava.com/ai-sucai/xxxx.mp4", // 资源比较多就不列举了.... ] # 随机抽取所需的视频片段 return random.sample(video_urls, num)
筛选完视频后,再一次获取筛选视频的时长,然后再利用 Python 代码将视频的时间线处理下:
输入参数:
video_url_list
:筛选视频video_duration
:筛选视频时长max_duration
:最大音频时长main_role_duration
:主星座图片时长。这个主要是为了保证视频和开场图片的时间线连贯输出参数:
video_infos
:视频数据bg_video_infos
:背景视频数据opening_video_infos
:开场背景视频数据opening_effect_infos
:开场背景视频数据特效(用于处理转场)代码也不是很难:
import jsonasync def main(args: Args) -> Output: params = args.params video_url_list = params["video_url_list"] video_duration = params["video_duration"] max_duration = params["max_duration"] main_role_duration = params["main_role_duration"] video_start = 2000000 + main_role_duration # 计算视频时长 video_duration_list = [] for duration in video_duration: duration1 = duration["data"]["duration"] video_duration_list.append(duration1 * 1000000) # 获取开场视频 open_video_url = "" for index,duration in enumerate(video_duration_list): if (duration >= video_start): open_video_url = video_url_list[index] del video_url_list[index] del video_duration_list[index] break opening_video_infos = [{ "video_url": open_video_url, "start": 0, "end": video_start, "width":1024, "height":1024 }] # 开场特效 opening_effect_infos = [{ "effect_title":"方形开幕", "start":video_start, "end":video_start + 1000000 }] # 构建视频数据 start = video_start end = 0 video_infos = [] for index,item in enumerate(video_url_list): duration2 = video_duration_list[index] end = start + duration2 if (end > max_duration): end = max_duration video_infos.append({ "video_url": item, "start": start, "end": end, "width":1024, "height":1024 }) start = end if start > max_duration: break # 纯黑背景视频 bg_video_url = "https://sike.skjava.com/ai/1748928397635_qha7zbgz1.mp4" bg_video_infos = [{ "video_url":bg_video_url, "start":video_start, "end": end, "width":1024, "height":1024, }] # 构建输出对象 ret: Output = { "opening_video_infos":json.dumps(opening_video_infos), "bg_video_infos":json.dumps(bg_video_infos), "video_infos":json.dumps(video_infos), "opening_effect_infos":json.dumps(opening_effect_infos) } return ret
处理完视频数据后,就处理开场音效和背景音乐。
背景音乐的话,我们利用 [search_bgm] 插件获取即可,在处理背景音乐的时候,由于也需要与音频的时间线保持一致,所以我们需要获取第一个时长比音频时长要长的背景音乐,代码如下:
async def main(args: Args) -> Output: params = args.params bg_audio = params["bg_audio"] max_audio_duration = params["max_audio_duration"] bg_audio_url = [bg_audio[0]["bgm_url"]] for item in bg_audio: if item["duration"] > max_audio_duration: bg_audio_url = [item["bgm_url"]] break bg_time_lines = [{ "start":2000000, "end":max_audio_duration }] # 构建输出对象 ret: Output = { "bg_audio_url":bg_audio_url, "bg_time_lines":bg_time_lines } return ret
到这里,整个视频、背景音乐都处理好了,最后就是将他们和其他数据,如文案、十二星座图片、文案音频都添加到剪映草稿中:
- 原文可以领取完整提示词、代码、工作流: 点击领取大明哥 AI 觉醒社 | AI 智能体