本文为博主原创,未经许可严禁转载。
本文链接:https://blog.csdn.net/zyooooxie/article/details/111720263
前面分享了一篇 代码改变生活-使用You-Get下载bilibili的视频【一】,这次说下 我使用时遇到的意外情况和解决思路。
后续还有一篇 使用You-Get下载bilibili的视频【三】,主要是代码优化+使用介绍。
这是我写的 代码改变生活的 category,有兴趣可以看看;
个人博客:https://blog.csdn.net/zyooooxie
默认下载的画质 并不是 the highest quality
上图,可以 看到you-get下载,会默认选择 质量最高的格式;
但我有遇到意外情况。
实际去查看下,
so 我会在下载时 不使用默认画质,都是指定画质;
查看 先后下载的 这视频文件的详细信息:
下载的视频只有声音、没有图像
下载某多p视频时,有些视频是没有图像的,
这就尴尬了。
没有图像,还看个鬼啊?
咋整呀?
我通过解析网页 拿到这个多p视频的所有aid、cid,调用 https://api.bilibili.com/x/player/playurl 这接口,实际下载的视频文件是有图像、有声音的;
【使用flv、mp4格式保存,都有图像+声音】
所以,会不会是ffmpeg在合并视频时 有问题?
那我 用you-get下载 不合并的视频,手动使用ffmpeg合并 看看?
手动合并的视频 也没有正常的显示图像啊;
源视频文件没问题,下载后的合并也没问题,感觉像是 下载的时候出了问题?格式的问题吗???
要不 就使用ffmpeg改个视频格式flv 再看看?
使用you-get直接下载flv格式的视频呢?
结论: 下载的mp4格式视频 播放没有图像时,可以转换flv格式 试下。
画质不支持
我下载 指定了 1080p;但是报错了。
由此可知,实际up主上传的视频本就画质差;
故 要改动下:
1.单个视频,直接改 --format
2.多p视频【相同画质】,直接改 --format
3.多p视频【画质各有不同】, 分别配置–format
所以之前的代码再优化 不如重写。【实际代码 在最下面 】
多p视频 实际只下了一个视频
看打印的信息,是下载的文件已经存在了; 【实际原因是 下载的文件名 是一样的】
回头看下实际的网页信息:
那咋解决呢?
我的思路: 某p下载后,对其做重命名。
(重命名 简单来,就选择其index;复杂得话 就获取实际名称,做重命名。下面代码使用的第二种 复杂的做法)
代码
def down_one(self, url, format_qn, down_path=r'F:\bili'):
"""
下载某url
:param url:
:param format_qn:
:param down_path:
:return:
"""
format_str = self.change_format(format_qn=format_qn)
cmd = """you-get {} {} -o {} --no-caption""".format(format_str, url, down_path)
print(cmd)
os.system(cmd)
def down_multipart(self, url, format_qn, root_path=r'F:\bili', special=None, some_p=None):
"""
批量下载
:param url:请求url
:param format_qn:画质,支持传int 和 list;
:param root_path:下载路径
:param special:默认为None,不用重命名
:param some_p: 单独下载某p;传list
:return:
"""
os.chdir(root_path)
new_dir = url.split('/')[-1]
if not os.path.exists(new_dir):
os.mkdir(new_dir)
down_path = os.path.join(root_path, new_dir)
if isinstance(format_qn, int) and special is None:
# 相同画质、文件名不重复
format_str = self.change_format(format_qn=format_qn)
cmd = """you-get {} --playlist {} -o {} --no-caption""".format(format_str, url, down_path)
print(cmd)
os.system(cmd)
elif isinstance(format_qn, list):
# 画质不同,文件名不重复:不必 重命名
if special is not None:
fact_name_list = self.get_name_list(url=url)
assert len(fact_name_list) == len(format_qn)
for index, i in enumerate(format_qn):
format_str = self.change_format(format_qn=i)
if some_p is not None:
assert len(some_p) == len(format_qn)
url_index = some_p[index]
else:
url_index = index + 1
new_url = ''.join([url, '?p={}'.format(url_index)])
cmd = """you-get {} {} -o {} --no-caption""".format(format_str, new_url, down_path)
print(cmd)
os.system(cmd)
if special is None:
continue
else:
# 相同画质、文件名重复
# 画质不同,文件名重复
name = fact_name_list[index]
os.chdir(down_path)
all_files = os.listdir(down_path)
all_files = [i for i in all_files if i.endswith(('mp4', 'flv'))]
down_file_last = sorted(all_files, key=lambda x: os.path.getmtime(x))[-1]
file_type = os.path.splitext(down_file_last)[1]
os.rename(down_file_last, ''.join([name, file_type]))
else:
raise Exception('format_qn 传参不合法')
def change_mp4_to_flv_new(self, file_path, file_name: list):
"""
转换格式
:param file_path: 路径
:param file_name: list类型;空list为全部file;
:return:
"""
os.chdir(file_path)
if len(file_name) == 0:
file_name = os.listdir(file_path)
for f in file_name:
new_f = self.delete_fileName_punctuation(f)
os.rename(f, new_f)
new_file = os.path.join(file_path, '.'.join([new_f[:-4], 'flv']))
cmd = """ffmpeg -i {} -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -qscale 6 -y {}""".format(
os.path.join(file_path, new_f), new_file)
print(cmd)
os.system(cmd)
sleep(1)
os.remove(new_f)
【下载的视频 仅做学习收藏之用,请尊重原创】
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie