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

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.xdnf.cn/news/18401.html

相关文章:

  • 数据预处理学习笔记
  • 【C++】--函数参数传递:传值与传引用的深度解析
  • 防爆自动气象监测设备:高危环境的 “安全堡垒”
  • SpringBoot中的条件注解
  • 工作后的总结和反思1
  • 如何制定股指期货投机交易策略计划?
  • 数字社会学是干什么的?数字社会学理论与数字社会学家唐兴通讲数字社会学书籍有哪些?AI社会学人工智能社会学理论框架
  • 使用jwt+redis实现单点登录
  • LeetCode 回文链表
  • 力扣1005:k次取反后最大化的数组和
  • Elasticsearch官方文档学习-未完待续
  • 三层交换机
  • Bartender 5 多功能菜单栏管理(Mac电脑)
  • 【学习嵌入式day-29-网络】
  • 深入解析C++非类型模板参数
  • 网络打印机自动化部署脚本
  • 软考 系统架构设计师系列知识点之杂项集萃(130)
  • 记录前端菜鸟的日常——小程序内嵌H5页面自定义分享按钮
  • 深入解析HashMap的存储机制:扰动函数、哈希计算与索引定位
  • 信息收集4----(收集网站指纹信息)
  • 20250821 圆方树总结
  • 一、部署LNMP
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码3
  • mac的m3芯使用git
  • 18维度解密·架构魔方:一览无遗的平衡艺术
  • LT8712SX,Type-C/DP1.4 /eDP转 DP1.4/HD-DVI2.0 带音频
  • AXI GPIO S——ZYNQ学习笔记10
  • Java项目:基于SpringBoot和VUE的在线拍卖系统(源码+数据库+文档)
  • K 均值聚类(K-Means)演示,通过生成笑脸和爱心两种形状的模拟数据,展示了无监督学习中聚类算法的效果。以下是详细讲解:
  • 【typenum】 19 类型相同检查(type_operators.rs片段)