python实现——视频转桌面壁纸

目录

  • 脚本介绍
  • 代码
  • GIF演示
  • 参考

周四,天气多云,心情阴,晚上翻收藏夹的时候发现了《依巴拉度~时间篇》,一部根据井上直久的绘画作品编辑而成的动画。看着这些精美的画面,萌生出一个想法,我能不能把视频里面的画面截取出来,作为我的桌面壁纸呢?说干就干。

除了《依巴拉度~时间篇》,也推荐游戏《GRIS》,画面非常美,可以找视频录播下载下来做壁纸。

脚本介绍

如果只是自己用的话,代码会简单非常多,只需要提取图片和更换壁纸的两个函数就行,但是总想把它完善,就有了现在这个更友好的工具。

脚本的作用:从网上,或者本地获取到视频,然后每隔一段时间提取出一张图片,并随机选取一张作为桌面壁纸,每隔一段时间壁纸可以自动更换,当手动结束程序的时候,壁纸才会停止更换。

代码

注意事项:

  1. 请安装相关的库文件

  2. 脚本可以直接运行,无需做修改

  3. 脚本使用了you-get来下载网络视频,其支持的站点参见完整列表

    支持同时下载多个视频

    考虑到you-get下载速度,以及其他情况,脚本也支持本地视频

  4. 提取出来的图片会进行分类,方便管理使用

import sys
import os
import cv2
import random
import ctypes
import time

from you_get import common as you_get  # 导入you-get库


# video_path = r'C:\Users\asuka\Desktop\test'  # 存储视频的文件夹
# video_url = 'https://www.bilibili.com/video/BV1ox411V7Gu'  # 需要下载的视频地址
# cut_time = 10  # 修改为每隔10秒截取一张图片


# 下载视频
def download_video():
    sys.argv = ['you-get', '-o', video_path, video_url]  # sys传递参数执行下载,就像在命令行一样;‘-o’后面跟保存目录。
    you_get.main()


# 从视频中截图图片
def get_img():
    video_type = [".avi", ".flv", ".wmv", ".mov", ".mp4", ".webm", ".vob", ".mng", ".qt", ".mpg", ".mpeg", ".3gp",
                  ".mkv"]

    for current_folder, list_folders, files in os.walk(video_path):
        for f in files:  # 用来遍历所有的文件,只取文件名,不取路径名
            if os.path.splitext(f)[-1] in video_type:  # 检查出视频文件
                copy_f = current_folder + '\\' + f  # 给出视频文件的绝对路径
                print('检查到视频文件:' + f)
                print('开始提取图片')
                picture_path = os.path.join(video_path, os.path.splitext(f)[0])

                os.makedirs(picture_path)
                os.chdir(picture_path)

                video_cap = cv2.VideoCapture(copy_f)  # 读取视频文件
                success, image = video_cap.read()
                fps = int(video_cap.get(cv2.CAP_PROP_FPS)) * cut_time
                count = 0
                while success:
                    if count % fps == 0:
                        cv2.imwrite("./%d.jpg" % int(count / fps), image)  # 指明存储图片的位置
                    # print('Process %dth seconds: ' % int(count / fps), success)
                    success, image = video_cap.read()
                    count += 1
                print('提取完毕:' + f)


# 设置桌面壁纸
def set_wallpaper():
    all_picture_path = []  # 用来存储所有图片的绝对路径
    for current_folder, list_folders, files in os.walk(video_path):
        for f in files:  # 用来遍历所有的文件,只取文件名,不取路径名
            if f.endswith('.jpg'):  # 检查出所有的图片
                picture_path = current_folder + '\\' + f  # 给出图片的绝对路径
                all_picture_path.append(picture_path)

    while True:
        filepath = random.choice(all_picture_path)  # 随机选取某张图片,建立绝对地址
        print(filepath)
        ctypes.windll.user32.SystemParametersInfoW(20, 0, filepath, 0)  # 设置桌面壁纸
        time.sleep(replace_wallpaper)  # 睡眠半个小时


print('''脚本的功能:
1:从你指定的url地址中下载视频(可选功能)
2:指明存储视频的文件夹
3:脚本会从视频中每隔数秒提取出一张图片
4:脚本会每隔一定时间,随机选取一张图片作为桌面壁纸''')

print()
choice = input('我希望使用本地视频(请按 1),我希望使用网络视频(请按 2):')
if choice == '2':
    print("请输入网址,每行输入一个。输入’quit‘结束输入")
    url_list = []  # 存储用户输入的内容
    while True:
        char = input()
        char = char.strip()
        if char == '':
            continue
        if 'quit' in char:
            break
        url_list.append(char)
    video_path = input('请输入用来存储视频的文件夹地址:')
    cut_time = int(input('每隔几秒截取图片:'))
    replace_wallpaper = int(input('每隔几秒更换壁纸:'))
    for video_url in url_list:
        download_video()
    get_img()
    set_wallpaper()
elif choice == '1':
    video_path = input('请输入用来存储视频的文件夹地址:')
    cut_time = int(input('每隔几秒截取图片:'))
    replace_wallpaper = int(input('每隔几秒更换壁纸:'))
    get_img()
    set_wallpaper()

GIF演示

由于需要提取图片,所以GIF时间较长

使用网络视频

使用本地视频

参考

@一行玩python: 五行Python自动换你的电脑桌面壁纸(内附源码和exe)
@zhimahuuu:视频切割:python将视频文件按秒存储成图片
@Mr.史:python you-get ffmpeg 下载哔哩哔哩视频

你可能感兴趣的:(python,python)