热线电话0898-88889999
网站首页 关于米乐体育 米乐注册 新闻动态 米乐登录 行业资讯 米乐开户 APP下载 代理加盟
网站公告 诚信为本:市场永远在变,诚信永远不变。
米乐注册
0898-88889999

海南省海口市

13988889999

admin@youweb.com

新闻动态

当前位置: 首页 > 新闻动态

Python自动剪辑搬运视频到抖音

发布时间:2024-05-13 11:21:30 点击量:

该项目可以直接拆解他人的素材,使用python识别视频节点,做二次剪辑,实现批量化洗稿

在其他平台做过英雄联盟集锦视频,这些视频是由若干素材拼接而成。想要搬运到抖音平台,为了降低重复度,因此需要对素材做打乱处理,从而规避版权问题。

下载英雄联盟集锦视频

识别拆分素材

素材乱序重构

配上新的BGM生成抖音短视频

自动生成抖音封面

自动投稿

视频网站是YTB,使用YTB-dl下载。

可以使用如下命令

在这里指定 'bestvideo+bestaudio' ,下载后的视频格式如下图所示:


可以规范命名,按照视频编号和视频名称命名。

首先可以使用opencv对视频做逐帧分析

# 识别视频关键帧
def read_video(video_path):
    cap=cv2.VideoCapture(video_path)
    global fps
    global end_c
    global start_c
    fps=cap.get(cv2.CAP_PROP_FPS)
    start_c=60*1000
    end_c=(int(cap.get(7)) - 25*60)*1000

    c=0
    cap.set(cv2.CAP_PROP_POS_FRAMES, c)  # 设置读取的位置,从第几帧开始读取视频

    while True:
        ret, frame=cap.read()
        # 检查是否完成
        if not ret:
            break
        true_ms=cap.get(cv2.CAP_PROP_POS_MSEC)
        check_hero(frame, true_ms)
        check_sub(frame, true_ms)
        check_start(frame, true_ms)
        check_end(frame, true_ms)
        c=c + 1
        if c % 600==0 :
            print(c_min_s(c),end=' : ')
            print(cut_dir)

可以发现视频主要是由若干素材拼接而成,每一个素材都是一分钟左右的短片,那么如何识别出素材是在什么时候切换呢?


可以用以下特征:

观察到,在一个新素材出现时,会在左下角出现该素材的玩家名等基本信息,那么可以在识别到该信息后,即可判定当前时间点为素材的起始时间。


在这里我们也不需要用非常准确的智能优化方法,可以使用利用图片本身的像素特征,比较图片的相似性:

在这里使用差异哈希方法,首先将图片尺寸修正,然后将对比每个像素块的相似度,最后获得结论。

# 差异值哈希算法
def dhash(image, size):
    # 将图片转化为8*8
    image=cv2.resize(image, (size + 1, size), interpolation=cv2.INTER_CUBIC)
    # 将图片转化为灰度图
    gray=cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    dhash_str=''
    for i in range(size):
        for j in range(size):
            if gray[i, j]> gray[i, j + 1]:
                dhash_str=dhash_str + '1'
            else:
                dhash_str=dhash_str + '0'
    result=''
    for i in range(0, size * size, 4):
        result +=''.join('%x' % int(dhash_str[i: i + 4], 2))
    return result

由于差异哈希算法比较的是全局的结果,可以对图片做二次裁剪,分析特定图片的识别精度。

我们将完整的图片做拆分,并且将其与flag文件下的hero图片做对比。

# 检查英雄位置
def check_hero(frame, cap):
    # 截取片段
    copy_img=frame[-hero_h_1:-hero_h_2, hero_w_1:hero_w_2]
    # 比较结果
    result=campHash(copy_img, cv2.imread('https://zhuanlan.zhihu.com/p/flag/hero.jpg'), 32)
    cv2.putText(copy_img, str(result)+'_'+str(cap), (0, 30),
                cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 0), 2)

    if result < 0.2:
        cv2.putText(copy_img, 'Done', (200, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 0), 2)
        data=get_s(cap)
        if data not in cut_dir['hero']:
            cut_dir['hero'].append(data)
    # 暂时保存
    cv2.imwrite('https://zhuanlan.zhihu.com/p/img/' + str(cap) + '.jpg', copy_img)

hero图片如下所示

选择几乎纯白作为识别色,主要原因在于我们逐帧分析logo出现画面,其中纯白帧数出现的较短,而且效果非常明显。

截取后的视频截图如下所示

在另一个文章中,介绍了如何将图片合成gif,将以上图片合成gif,可以发现,在出现在白光时,有一个明显的阈值波峰,我们可以根据阈值设置,来识别时间的起始端。

最终拆解结果如下所示:

根据起始节点和终止节点,以及英雄特征等参数,识别视频片段的始末时间点,下一步就是对这些时间点做二次拆分。

cut_node={'hero':['0:0', '0:37', '0:55', '1:20', '1:46', '2:16', '2:39', '2:46', '3:0', '3:30', '4:5', '4:22', '4:51', '5:15', '5:47', '6:12', '6:40', '6:41', '7:8', '7:29', '7:49', '8:1', '8:22', '8:40', '8:50', '9:1', '9:9', '9:26', '9:51', '10:3', '10:14', '10:32', '10:33', '10:41', '10:58', '11:16', '11:33', '12:9', '12:40', '13:0', '13:14', '13:29', '13:36', '13:44', '14:2', '14:51', '15:6', '15:23', '15:37', '15:46'], 'sub':['2:13', '2:14', '14:39', '15:20'], 'start':['0:34'], 'end':[]}

如果直接把素材拼接,不利用视频降重,因此需要将素材调序,降低重复度,并且根据抖音实际要求,对视频长度做裁剪。这一部分比较简单,就是做拆分处理。

根据先前获得的数据,将视频做隔断

视频1 | logo | 视频2 | 视频3 订阅 | 视频4 | 片尾 hero--start--hero--hero--sub---hero--end--- start 和 end 加入hero排序` 按照间隔做分割,要超剪一点,保证没有重叠 然后间隔里有sub就删掉

核心函数如下

# 原始节点
cut_node=get_cut_node()

# 获得可以使用的视频片段
video_start_end_list=c_split(cut_node)
# 因为抖音时长在三分钟以内,所以做二次整理归类
out_cut_node=douyi_video(video_start_end_list)

# 调整顺序
fix_cut_node=fix_cut(out_cut_node, 1*fps)

这一步使用的是moviepy.editor库,这个库可以自动化的处理视频音频,可以实现很好的视频合成功能。

# 构建视频
def build_video(cut_s_list, video_path, video_num):
    raw_video = VideoFileClip(video_path)
    raw_video_without_audio = raw_video.without_audio()

    for i, first in enumerate(cut_s_list):
        if i == video_num:
            exit()

        audioclip = AudioFileClip('https://zhuanlan.zhihu.com/p/bgm/'+str(i)+'.mp3')

        clip_list = []
        for second in first:
            clip_list.append(raw_video_without_audio.subclip(second[0], second[1]))
        finalclip = concatenate_videoclips(clip_list)
        audioclip = audioclip.subclip(0, finalclip.duration)
        finalclip = finalclip.set_audio(audioclip)
        finalclip.write_videofile(str(i)+'.mp4')

同样也是使用python实现,后续再介绍

可以使用代码实现自动添加封面,自动添加热点,自动添加位置信息,自动定时发布

阿卡丽峡谷穿越旅行 | 07 英雄联盟-瞬间秒杀 #lol #细节操作 #细节操作 @DOU+小助手

抖音搜索 @兔小萌

联系方式见链接

联系方式 - 兔小萌


平台注册入口