网上的b站视频下载工具其实已经是一箩筐了,但是大部分有个问题,就是不支持批量下载。
不废话,直接说搜索的结果,目前发现的两个可用的:
b站下载姬:https://github.com/FlySelfLog/downkyi 最好用的就是这个了,我也是用这个。
自己号称东半球第二快的用go语言实现的程序:https://github.com/sodaling/FastestBilibiliDownloader 这个东西,首先因为作者太懒,没有打包成exe,所以导致配置起来相当麻烦,你直接下载下来跑的话会各种报错,需要下载很多go的库,同时,需要你有一点go语言基础。然后是,这个东西本身是有问题的,下载一个up主的视频会少了最后一页,大概是他的代码的for循环少了个+1吧。因为代码很凌乱很绕,感觉像在炫技一样,我对go语言的研究也不深,所以就不改他的代码了,直接pass。
用b站下载姬批量下载完某up主的视频之后就是转换问题了。为什么要转换呢,这是因为我在b站上面看up主兔肉菌的绘画类视频觉得很有意思,很有学习价值,所以想要弄成pdf来临摹,这样也方便我打印嘛。
于是想到了python是可以用opencv库来截图的。那就好办了:)
上代码,第一个是单个的版本,第二个是批量转换:
import os
import time
import cv2
import shutil
from fpdf import FPDF
filename = input("请输入下载的文件名(注意不要添加文件名后缀):")
try:
cap = cv2.VideoCapture(os.path.dirname(os.path.abspath(__file__)) + '\\' + filename + '.flv')
print("读取视频成功...")
except:
print("读取视频失败,请检查文件名或文件路径是否正确...")
outputpath = os.path.dirname(os.path.abspath(__file__)) + '\\output'
if not os.path.exists(outputpath):
print("创建临时文件夹output...")
os.makedirs(outputpath)
else:
print("检测到临时文件夹output...")
count = 0
num = 1
print("开始截屏...")
while cap.isOpened():
ret, frame = cap.read()
if ret:
cv2.imwrite(os.path.dirname(os.path.abspath(__file__)) + '\\output\\frame{:d}.jpg'.format(count), frame)
count += 100 # i.e. at 300 fps, this advances one second
print("正在截取第"+str(num)+"张")
num += 1
cap.set(1, count)
else:
cap.release()
print("截屏完成,共计"+str(num)+"张~")
break
imagelist = os.listdir(outputpath)
print("开始将图片合并后pdf,请耐心等待几秒钟...")
#format 后面的是尺寸,我们的视频默认就是这个尺寸,所以不用改了
pdf = FPDF(unit = "pt", format = [1920, 1080])
# imagelist is the list with all image filenames
for image in imagelist:
pdf.add_page()
pdf.image(outputpath + "\\" + image,0,0)
pdf.output(os.path.dirname(os.path.abspath(__file__)) + '\\'+ filename +'.pdf', "F")
print("pdf合成完成!")
filelist=os.listdir(outputpath) #列出该目录下的所有文件名
for f in filelist:
filepath = os.path.join(outputpath,f) #将文件名映射成绝对路劲
if os.path.isfile(filepath): #判断该文件是否为文件或者文件夹
os.remove(filepath) #若为文件,则直接删除
elif os.path.isdir(filepath):
shutil.rmtree(filepath,True) #若为文件夹,则删除该文件夹及文件夹内所有文件
shutil.rmtree(outputpath,True)
print("清空并删除临时文件夹output...")
t = 5
while t:
print(str(t) + "秒后关闭...")
t -= 1
time.sleep(1)
print("关闭,下次见~")
import os
import datetime
import cv2
import shutil
from fpdf import FPDF
rootdir = os.getcwd() + '\\全部'
li = os.listdir(rootdir)
if not os.path.exists(os.getcwd() + '\\output'):
os.makedirs(os.getcwd() + '\\output')
def mprint(s):
print(str(datetime.datetime.now())+" " + s)
def convert(index,whole,lii,f):
mprint('处理第'+str(index)+'个视频,共'+str(whole)+'个')
temp = os.getcwd() + '\\output\\'+lii
try:
cap = cv2.VideoCapture(rootdir + "\\" + lii + "\\" + f)
count = 0
num = 1
if not os.path.exists(temp):
os.makedirs(temp)
while cap.isOpened():
ret, frame = cap.read()
if ret:
cv2.imencode('.jpg',frame)[1].tofile(temp+'\\frame{:d}.jpg'.format(count))
count += 100 # i.e. at 300 fps, this advances one second
mprint("正在截取第"+str(index)+"个视频第"+str(num)+"张")
num += 1
cap.set(1, count)
else:
cap.release()
mprint("截屏完成,共计"+str(num)+"张~")
break
except:
mprint("读取视频失败,请检查文件名或文件路径是否正确...")
imagelist = os.listdir(temp)
mprint("开始制作第"+str(index)+"个pdf,请耐心等待几秒钟...")
#format 后面的是尺寸,我们的视频默认就是这个尺寸,所以不用改了
pdf = FPDF(unit = "pt", format = [1920, 1080])
# imagelist is the list with all image filenames
for image in imagelist:
pdf.add_page()
pdf.image(temp + "\\" + image,0,0)
pdf.output(temp +'.pdf', "F")
mprint("第"+str(index)+"个pdf合成完成!")
filelist=os.listdir(temp) #列出该目录下的所有文件名
for f in filelist:
filepath = os.path.join(temp,f) #将文件名映射成绝对路劲
if os.path.isfile(filepath): #判断该文件是否为文件或者文件夹
os.remove(filepath) #若为文件,则直接删除
elif os.path.isdir(filepath):
shutil.rmtree(filepath,True) #若为文件夹,则删除该文件夹及文件夹内所有文件
shutil.rmtree(temp,True)
for i in range(0,len(li)):
for root,dirs,files in os.walk(os.path.join(rootdir,li[i])):
for f in files:
if f.endswith(".mp4"):
convert(i+1,len(li),li[i],f)
break
第二个脚本需要放在下载姬下载的视频的那个download文件夹里面才能跑。