B站视频下载方法之--手机下载后再转移至电脑

编程知识 更新时间:2023-04-17 20:09:42

文章目录

  • 1.背景
  • 2. 实现过程
    • 一. 下载文件至手机
    • 二. 找到手机中的文件
    • 三. 把文件转移至电脑
    • 四. 组合音频文件和视频文件
  • 3.不足之处

1.背景

  今天想在B站上下载一套教程,奈何人比较菜不会用爬虫,就想着用第三方的’唧唧’来下载。可惜唧唧的下载速度太慢了,大概只有150kb/s,就想着先通过手机下载,再把文件转移到电脑上。(硕鼠没用过,不知道速度如何)

2. 实现过程

一. 下载文件至手机

手机下载视频应该是不限速的,下载速度非常快,基本有4-5mb/s,20G的视频也很快下好了,不过记得给手机留出足够的空间

二. 找到手机中的文件

对于安卓手机,如果没有自行设置储存位置的话,B站下载的视频会放在【所有文件】-- 【Android】 – 【data】 – 【tv.danmaku.bili】-- 【download】下

在手机上进入文件,会发现三个文件夹(这是因为我刚刚下载了三个分P)

选择任一文件夹进入,里面的三个子文件夹
‘64’存放视频音频文件
danmaku.xml存放弹幕信息
‘entry.json’存放了该视频的基本信息(标题,分P等信息都在这里面)

进入’64‘文件,我们发现视频被分成了音频文件’autio.m4s‘和视频文件’video.m4s’。我们需要先将他们改成’.mp4’格式再合并成一个MP4文件。

三. 把文件转移至电脑

然而,当连接手机后,发现在电脑中打开’download‘文件夹是空的,根本不存在我们下载的视频。

我猜测应该是这个’download‘文件夹存在特殊之处,所以我们需要在手机上将视频文件转移到其他地方。


将文件复制到\Android\data\tv.danmaku.bili\94680592后,我们就可以复制或者剪切这些文件到电脑上了。

四. 组合音频文件和视频文件

如果视频分P较少,可以手动将两个’.m4s’文件改为’.mp4’文件,再使用格式工厂将二者组合。

因为我需要下载100P,会有100个c_开头的文件,一个个改不切实际,就写了个python小脚本来实现自己更改文件后缀和合并音、视频。

# -*- coding:utf-8 -*-

import os, json
import subprocess


def video_add_mp4(audio_file, video_file, output_name):
    """
    :param audio_file: 音频文件位置
    :param video_file: 视频文件位置
    :param output_name: 输出文件位置(别和音频或者视频文件共用文件夹)
    :return:
    """
    # 合并音视频文件的命令,其中一定要写E:\\FFmpeg_1.07\\bin\\ffmpeg.exe这个绝对路径,不能用添加了环境变量的ffmpeg
    cmd = f'E:\\FFmpeg_1.07\\bin\\ffmpeg.exe -i {audio_file} -i {video_file} -c:v copy -c:a copy {output_name}'
    print(cmd)

    # subprocess.call(cmd, shell=True) # 这个方法会打印命令行结果
    subprocess.Popen(cmd, shell=True)  # 这个方法不会,看起来舒服一点


if __name__ == '__main__':

    base_dir = r'E:\基础文件夹'  # 从手机导入的文件所在的文件夹
    output_dir = r'E:\输出文件夹'  # 需要导出到的文件夹
    dirs = os.listdir(base_dir)  # dirs = [c_277730788, c_277730759, c_277730782 ...],获取每一page
    count = 1

    for video_dir in dirs:
        video_file = None
        audio_file = None
        # 获得'c_277730788'文件夹下的'entry.json'文件,其中包含了视频标题tittle和page
        if os.path.exists(os.path.join(base_dir, video_dir, 'entry.json')):
            entry = os.path.join(base_dir, video_dir, 'entry.json')
            with open(entry, encoding='utf8') as f:
                entry_info = json.load(f)
                # tittle = entry_info['tittle']  # 视频标题
                page = entry_info['page_data']['page']  # page,即平时说的第几P
                # print('分集', page)

        # 把.m4s视频文件转化成.MP4
        if os.path.exists(os.path.join(base_dir, video_dir, '64', 'video.m4s')):
            video_file = os.path.join(base_dir, video_dir, '64', 'video.m4s')
            name = os.path.splitext(video_file)[0]
            os.rename(video_file, name + '.mp4')

        # 把.m4s音频件转化成.MP4
        if os.path.exists(os.path.join(base_dir, video_dir, '64', 'audio.m4s')):
            audio_file = os.path.join(base_dir, video_dir, '64', 'audio.m4s')
            name = os.path.splitext(audio_file)[0]
            os.rename(audio_file, name + '.mp4')

        # print('视频大小:', count, os.path.getsize(video_file) / 1024 / 1024)
        # print('音频大小:', count, os.path.getsize(audio_file) / 1024 / 1024)

        # 准备转化输出
        output_name = os.path.join(output_dir, str(page) + '.mp4')  # 以page开头来命名,方便视频排序,tips:我直接忽略掉标题了...
        if video_file and audio_file:
            video_add_mp4(video_file, audio_file, output_name)
            print(f'第{count}个视频转化完成!,是第{page}分P')
            count += 1

脚本内需要用到ffmpeg工具,可以去网上下载。
注意代码内的这部分:

3.不足之处

1. 整个过程略显繁琐
2. 脚本写得比较简陋

更多推荐

B站视频下载方法之--手机下载后再转移至电脑

本文发布于:2023-04-14 03:36:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/b2f7450000780250c3ac2c1e69671630.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:下载方法   电脑   手机   视频

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 74582文章数
  • 14阅读数
  • 0评论数