如何把B站缓存的视频,下载到电脑上?(moviepy方案)

2020-04-06  本文已影响0人  咦咦咦萨

声明:本文展示的方法,绝对不是最佳方案,仅供参考

我一直把B站当成一座知识的宝库,偶尔也能挖到意想不到的资源。一般这时,我就会小手一抖,缓存这种 限时特供 的资源。那么问题来了,怎么把视频从手机搞到电脑或其他设备上呢?

第一步: 找到缓存的文件

以android手机为例,B站缓存的资源路径为:内部存储设备>Android>data>tv.danmaku.bili>download

image.png

第二步: 将文件拷贝到电脑

如上图,将10000XXXX和882XXXXXXX文件夹拷贝到电脑,传输工具可以选择Android传输工具(Mac端)

image.png

第三步: 分析缓存结构

882XXXX文件下,按集数序号生成文件夹,文件夹内结构基本固定。

image.png

第四步: 利用moviepy合并视频音频

安装moviepy

sudo pip install --ignore-installed  moviepy

编写实现代码

from moviepy.editor import *
import json
import os



def getTitle(entry_json_path):
    """
    读取entry.json,获取资源标题
    """
    f = open(os.path.join(entry_json_path, "entry.json"), encoding='utf-8')
    entry = json.load(f)
    return entry['page_data']['download_subtitle']


def mix(video_path, target_dir):
    """
    合并video.m4s和audio.m4s,输出mp4文件
    """
    video = VideoFileClip(os.path.join(video_path, "video.m4s"))
    audio_clip = AudioFileClip(os.path.join(video_path, "audio.m4s"))
    movie = video.set_audio(audio_clip)
    movie.audio = movie.audio.set_duration(video.duration)
    title = getTitle(os.path.dirname(video_path))
    print("开始渲染文件:" + title)
    movie.write_videofile(os.path.join(target_dir, title) + ".mp4", fps=25)
    print("结束渲染文件:" + title)


def getVideoPath(parent_path, dir, video_paths):
    """
    递归获取视频文件路径
    """
    path = os.path.join(parent_path, dir)
    if os.path.isdir(path):
        files = os.listdir(path)
        for file in files:
            if file == '.DS_Store':
                continue 

            if file == 'video.m4s':
                video_paths.append(path)

            if os.path.isdir(os.path.join(path, file)):
                getVideoPath(path, file, video_paths)
    elif dir == 'video.m4s':
        video_paths.append(parent_path)


if __name__ == '__main__':
    # 缓存目录
    base_dir = '/Users/admin/Downloads/882576229'
    # 合成文件存储路径
    target_dir = '/Users/admin/Downloads/882576229'
    # 遍历缓存目录,执行合并文件
    video_paths = []
    filenames = os.listdir(base_dir)
    for filename in filenames:
        if filename == '.DS_Store':
            continue 
        getVideoPath(base_dir, filename, video_paths)

    for video_path in video_paths:
        mix(video_path, target_dir)

第五步: 执行合并

python av.py
image.png

总结

  1. 本方案适合喜欢动手的同学,在资源允许的情况下,执行批量操作。
  2. moviepy比较吃资源。


    image.png
上一篇 下一篇

猜你喜欢

热点阅读