代码改变生活-使用You-Get下载bilibili的视频【二】

本文为博主原创,未经许可严禁转载。
本文链接: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值