当前位置: 首页 > news >正文

pthon实现bilibili缓存视频音频分离

几个月前写的,比较粗糙,但是能运行

import os
import fnmatch
import subprocess'''
Bilibili缓存的视频,*280.m4s结尾的是音频文件,其他m4s结尾的是视频,删除16进制下前9个0,即为正常音/视频
使用os.walk模块,遍历每一个目录,对每个子目录下存在的以上两个文件进行修改
去掉前九个0以后,输出到新的目录output
创建output/outputVideo目录,利用ffmpeg合成新的MP4视频到output目录的outputVideo中,作为最终转换的视频
'''def conVert(path,outpath):#需要进行合成的m4s文件列表mp3lt = []mp4lt = []for root,dirs,files in os.walk(path):#对目录进行遍历#root表示当前的根目录,dirs表示当前目录下所有文件夹,files表示当前目录下所有文件dirs[:] = [d for d in dirs if d!="output"]#跳过output目录的遍历if '.a' in files:#为了提高效率,已经转换过的视频,在视频所处目录下添加一个".a"的空文件,作为标记#不存在".a"文件的目录,两个m4s后缀的文件分别加入mp3lt和mp4lt中,代表这个视频还没有进行过视频转换,反之亦然print("目录{}已进行过视频格式转换".format(root))dirs[:] = []#files是当前目录下的所有文件的列表,若列表中存在".a",则表示不需要进行视频转换,dirs清空,直至遍历下一个目录时重置 continue    #跳过for f in files:#对此次遍历所处的目录下的所有文件进行遍历if fnmatch.fnmatch(f,'*280.m4s'):#若存在音频文件mp3lt.append(f+'.mp3')#添加进转换列表中fn_mp3 = os.path.join(root,f)   #去除9个字节后的文件保存路径with open(fn_mp3,'rb') as fmp3:fmp3.read(9)    #读取前9个字节remaining_content = fmp3.read() #保留剩余的字节with open(os.path.join(outpath,f+'.mp3'),'wb') as fmp3:fmp3.write(remaining_content)   #将剩余的字节写入新的文件中if fnmatch.fnmatch(f,'*.m4s') and not fnmatch.fnmatch(f,'*280.m4s'):#若存在视频文件mp4lt.append(f+'.mp4')#添加进转换列表中fn_mp4 = os.path.join(root,f)   #去除9个字节后的文件保存路径with open(fn_mp4,'rb') as fmp4:fmp4.read(9)    #读取前9个字节remaining_content = fmp4.read() #保留剩余的字节with open(os.path.join(outpath,f+'.mp4'),'wb') as fmp4:fmp4.write(remaining_content) #将剩余的字节写入新的文件中with open(os.path.join(root,'.a'),'wb') as a:#创建空文件作为标记passprint(f"成功创建标记{os.path.join(root,'.a')}")return mp3lt,mp4lt#返回列表
def delete_file(path):#删除".a"标记delete_counted = 0for root,dirs,files in os.walk(path):dirs[:] = [d for d in dirs if d!="output"]if '.a' in files:os.remove(os.path.join(root,'.a'))delete_counted += 1print(f"已删除:{os.path.join(root,'.a')}")dirs[:] = []continueelse:print(f"{os.path.join(root,'.a')}文件不存在")continueprint(f"已删除数量:{delete_counted}")
def convert_video(mp3lt,mp4lt,outpath):#对m4s文件进行合成conVert_conuts = len(mp4lt)output = os.path.join(outpath+'\outputVideo')#最终的mp4视频写入outputVideo文件夹中if conVert_conuts!=0 :#存在需要进行转换的视频时for m in range(conVert_conuts):#ffmpeg合成视频的命令command = ["ffmpeg","-i",os.path.join(outpath,mp4lt[m]),"-i",os.path.join(outpath,mp3lt[m]),"-codec","copy",os.path.join(output,mp4lt[m].split(".")[0]+'.mp4')]#print(command)subprocess.run(command)else:print("当前没有需要转换的视频")
def convert(path,outpath):mp3lt,mp4lt = conVert(path,outpath)print(mp3lt,mp4lt)convert_video(mp3lt,mp4lt,outpath)
#需要转换时执行convert方法,需要删除".a"标记重新转换视频时,先执行delete_file方法再执行convert方法
def main():path="D:\BiliDownload\VIdeosBiliBili"outpath = "D:\BiliDownload\VIdeosBiliBili\output"convert(path,outpath)#delete_file(path)
main()```
http://www.dtcms.com/a/344167.html

相关文章:

  • Redis内存碎片深度解析:成因、检测与治理实战指南
  • K8s存储类(StorageClass)设计与Ceph集成实战
  • 为什么应用会突然耗尽所有数据库连接
  • 智慧清洁时代来临:有鹿机器人重新定义城市清洁标准
  • 【数据结构】B 树——高度近似可”独木成林“的榕树——详细解说与其 C 代码实现
  • python selenium+pytest webUI自动化基础框架
  • 去中心化身份--改变格局的关键
  • 图数据库(neo4j)基础: 分类/标签 节点 关系 属性
  • 整数规划学习总结
  • 为什么给数据表加了索引,写入速度反而变慢了
  • 数据库原理及应用_数据库基础_第2章关系数据库标准语言SQL_数据查询(3)连接查询
  • 基于Python/django的仓库库存管理系统#基于Python的仓库管理系统#基django的J进销存管理系统
  • 力扣热题之贪心算法
  • halcon算子—gen_rectangle2和gen_rectangle1区别
  • Java泛型深度解析:从基础语法到高级应用
  • Java 19 新特性及具体应用
  • K8S高可用集群
  • 藏在 K8s 幕后的记忆中枢(etcd)
  • API模型与接口弃用指南:历史、替代方案及开发者应对策略
  • 疏老师-python训练营-Day53 对抗生成网络
  • Linux数字列排序命令
  • 【计算机视觉与深度学习实战】08基于DCT、DFT和DWT的图像变换处理系统设计与实现(有完整代码python3.13可直接粘贴使用)
  • 四十二、【核心功能强化】用例管理与调试:批量删除与在线请求测试
  • 使用EasyExcel自定义导出表格
  • 安全、高效、可靠的物理隔离网络安全专用设备———信刻光盘安全隔离与文件单向导入系统!
  • VLLM部署gpt-oss-20b踩坑记录
  • 集成电路学习:什么是SVM支持向量机
  • 快速了解神经网络
  • DigitalOcean Gradient AI平台现已支持OpenAI gpt-oss
  • 2025年大模型选型核心指南:Beyond GPT-4,如何理性评估Qwen、DeepSeek等强者?