python提取合成b站电脑缓存视频

经网上搜索,b站在电脑里的缓存视频是每个视频一个文件夹,音视频各为独立的m4s文件,视频描述为videoInfo.json,关键在m4s文件前9个0必须去掉才能合成成功,另外判断m4s究竟哪个是视频哪个是音频,其实可以从文件大小可以大致分别,但有大神分析出了一些规律,所以参考使用,最后用ffmpeg进行合成成功。

import json
import os
import sys

#定义b站代码列表
def get_code_list():
    code_list=[
        ['30112','v'],
        ['30102', 'v'],
        ['30080', 'v'],
        ['30077', 'v'],
        ['30066', 'v'],
        ['30064', 'v'],
        ['30033', 'v'],
        ['30032', 'v'],
        ['30016', 'v'],
        ['30011', 'v'],
        ['30015', 'v'],
        ['30116', 'v'],
        ['30280', 'a'],
        ['30232', 'a'],
        ['30216', 'a'],
    ]
    return code_list

#转换视频m4s文件
def get_video_content(video_path):
    video_path_out = os.path.dirname(video_path) + r'\video.m4s'
    with open(video_path, 'rb') as file:
        content = file.read()
    with open(video_path_out, 'wb') as f:
        f.write(content[9:])
    print('转换后的视频为:', video_path_out)
    return video_path_out

#转换音频m4s文件
def get_audio_content(audio_path):
    audio_path_out = os.path.dirname(audio_path) + r'\audio.m4s'
    with open(audio_path, 'rb') as file:
        content = file.read()
    with open(audio_path_out, 'wb') as f:
        f.write(content[9:])
    print('转换后的音频为:', audio_path_out)
    return audio_path_out

#从videoInfo.json中获取视频的标题
def get_videoname(cid):
    json_name="videoInfo.json"
    json_path=folder_path+json_name
    if os.path.exists(json_path):
        #读取记录了视频音频数据的.json
        with open(json_path,'r', encoding='utf-8') as info:
            entryJson = json.load(info)
            return entryJson.get("title", "")

#获取文件夹内音视频文件名
def get_m4sfiles(cid):
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        if os.path.isfile(file_path) and cid in filename:  # 确认是文件而非文件夹
            filetype=check_file_type(filename)
            if filetype=='v':
                video_files.append(filename)
            elif filetype=='a':
                audio_files.append(filename)

def check_file_type(filename):
    file_code=filename.split('.')[0].split('-')[-1]
    for i in range(len(code_list)):
        if code_list[i][0]==file_code:
            return code_list[i][1]

if len(sys.argv)<=1:
    print('请提供目录参数。')
    exit()
cid = sys.argv[1]

cache_path=r'C:\Users\xxx\Videos\bilibili'
folder_path=cache_path+'\\'+cid+'\\'
title=""
video_files=[]
audio_files=[]

#获取视频标题
code_list=get_code_list()
title=get_videoname(cid)
get_m4sfiles(cid)
v_path=folder_path+video_files[0]
a_path=folder_path+audio_files[0]
#转换音频视频m4s
get_video_content(v_path)
get_audio_content(a_path)

#合并视频
v_path=folder_path+'video.m4s'
a_path=folder_path+'audio.m4s'
output = folder_path+title+'.mp4'
ffmpeg_path = r"C:\ffmpeg\ffmpeg.exe"
cmd = ffmpeg_path + " -i "+v_path+" -i "+a_path+" -c:v copy -strict experimental " + output
print(cmd)
os.popen(cmd)
print ('合并m4s文件成功')

cache_path为b站软件的缓存文件夹,自己查找修改一下

ffmpeg_path为ffmpeg.exe的路径,按需修改一下

本程序参考了

https://zhuanlan.zhihu.com/p/642447186Python爬取b站视频并分析视频清晰度问题 - 『编程语言区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值