python实现多线程从b站下载多个视频并合并
前言
疫情期间每天坚持在家运动,都是从B站上看的视频,每天要做好几个视频。可能因为自己懒的缘故,就想着能不能把自己要做的运动个性化的合成一个视频。万事对于程序员来说,只要有规律,万事皆可肝。计划过段时间写一写人工智能的专栏,希望能见证到一个小白的成长之路。
准备工作
- python3环境
- pip install you-get如果需要更新的话用pip install --upgrade you-get进行更新
- 将下载好的flv格式转为MP4,如果直接下载的就是MP4则跳过这步
- 合并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超级方便
- win+R打开cmd
- 切换至相应路径,先cd到相应磁盘,我是d盘,就是 cd d:
- cd 文件所在目录
- copy/b 1.flv 1.mp4
如下
将多个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)
总结
遇事多百度,万事皆有规律则万事皆可编码。虽然这次耗费了好几个小时,但是以后再截取视频的时候就只需要改几个路径,还是省了不少功夫。
延续我的每日一句,今日份的小确幸:
把小蛋糕敲晕了再吃,安抚可乐等气消了再喝,夹心饼干劝分了再泡牛奶。
——————《菊次郎的夏天》