python实现多线程从b站下载多个视频并合并

python实现多线程从b站下载多个视频并合并

    • 前言
    • 准备工作
    • 使用you-get进行多线程下载
    • 将下载好的flv文件转成MP4
    • 将多个MP4视频进行合并
    • 总结

前言

疫情期间每天坚持在家运动,都是从B站上看的视频,每天要做好几个视频。可能因为自己懒的缘故,就想着能不能把自己要做的运动个性化的合成一个视频。万事对于程序员来说,只要有规律,万事皆可肝。计划过段时间写一写人工智能的专栏,希望能见证到一个小白的成长之路。

准备工作

  1. python3环境
  2. pip install you-get如果需要更新的话用pip install --upgrade you-get进行更新
  3. 将下载好的flv格式转为MP4,如果直接下载的就是MP4则跳过这步
  4. 合并MP4文件,bingo

使用you-get进行多线程下载

关于you-get的适用范围我找了一篇文章
链接you-get的使用及安装说明
各个文章都介绍的比较详细,其实只需要你win+R打开cmd,输入

  • pip install you-get
  • you-get “URL”
    这时候下载的flv文件默认存在C:\Users\用户名\,但不建议这么操作,因为不好整理
  • 所以使用
    you-get -o 你想存放的路径 “URL”

更多的使用方法大家可以自行查找,这是一个很强大的库,可从各个地方下载视频。
我是在Python中调用了os和you-get包实现的多线程下载,确实比一个一个下载要快,适用于多个视频下载,代码如下:

import sys
from you_get import common as you_get
from multiprocessing import Pool

# 路径自己定义
directory = r'D:\python_work\project\downloadMP4\mp4'
urls = []
def download(urls):
    sys.argv = ['you-get', '-o', directory, '--no-caption', urls]
    you_get.main()


if __name__ == '__main__':
#这里你可以添加自己想下载的链接
    urls .append("https://www.bilibili.com/video/BV1w7411M7yk")#天鹅臂
    urls.append("https://www.bilibili.com/video/BV1bJ411a72W")#核心训练
    urls.append("https://www.bilibili.com/video/BV1JW411o7Jq")#xo型腿
    urls.append("https://www.bilibili.com/video/BV1yb411G7Me?p=5")#拉伸
    pool = Pool(4)
    pool.map(download, urls)
    pool.close()
    pool.join()

将下载好的flv文件转成MP4

这步我也没有找到很好的方法,开始我计划直接用视频转换器,下面贴一个视频转换器的链接。直接下载下来就是MP4格式可以跳过这一步。
链接:https://www.xunjieshipin.com/video/flv2mp4
但是有个鸡肋的问题,文件大小不超过20M。。。。emmmm,黑人问号脸,然后我又去查了查资料,推荐第二种方法:系统自带copy/b超级方便

  1. win+R打开cmd
  2. 切换至相应路径,先cd到相应磁盘,我是d盘,就是 cd d:
  3. cd 文件所在目录
  4. copy/b 1.flv 1.mp4
    如下
    python实现多线程从b站下载多个视频并合并_第1张图片

将多个MP4视频进行合并

环境依赖

  • pip install moviepy
  • pip install ffmpeg
  • pip install natsorted

代码如下:

# 主要是需要moviepy这个库
from moviepy.editor import *
import os
from natsort import natsorted

L = []

for root, dirs, files in os.walk("D:\python_work\project\downloadMP4\mp4"):
    # 按文件名排序
    files.natsorted(files)
    # 遍历所有文件
    for file in files:
        # 如果后缀名为 .mp4
        if os.path.splitext(file)[1] == '.mp4':
            # 拼接成完整路径
            filePath = os.path.join(root, file)
            # 载入视频
            video = VideoFileClip(filePath)
            # 添加到数组
            L.append(video)

# 拼接视频
final_clip = concatenate_videoclips(L)

# 生成目标视频文件
final_clip.to_videofile("mp4/target.mp4", fps=24, remove_temp=False)

总结

遇事多百度,万事皆有规律则万事皆可编码。虽然这次耗费了好几个小时,但是以后再截取视频的时候就只需要改几个路径,还是省了不少功夫。
延续我的每日一句,今日份的小确幸:
把小蛋糕敲晕了再吃,安抚可乐等气消了再喝,夹心饼干劝分了再泡牛奶。
——————《菊次郎的夏天》

你可能感兴趣的:(小工具)