B站缓存视频数据m4s转mp4

news2025/6/6 11:13:57

B站缓存视频数据m4s转mp4

  • 结构分析

结构分析

在没有改变数据存储目录的情况下,b站默认数据保存目录为:
`Android->data->tv.danmaku.bili->download`

在这里插入图片描述
每个文件夹代表一个集合的视频,比如,我下载的”java从入门到精通“,那么就会保存到一个目录里面:
在这里插入图片描述
每个以c_开头的都是一个小章节。
在这里插入图片描述
每个小章节包含entry.json(视频标题及章节名称等信息),danmaku.xml(弹幕),64或80等(视频文件及音频文件等)
在这里插入图片描述
将audio.m4s以及video.m4s合成后就是一个完整的视频。本地得安装ffmpeg或者使用python-ffmpeg。
关键部分代码:

command = [
            "ffmpeg",
            "-i", video_m4s,  # 输入视频文件
            "-i", audio_m4s,  # 输入音频文件
            '-c:v', 'copy',  # 不重新编码视频
            '-c:a', 'copy',  # 不重新编码音频
            "-y",  # 覆盖已存在的文件
            output_mp4  # 输出文件
        ]

        # 使用 subprocess.run 执行命令
        result = subprocess.run(command)

将整个标题的视频转换出来。

#!/usr/bin/python3
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
import subprocess
import os
import json
import ffmpeg


def select_source():
    # 选择视频源目录
    dir_path = filedialog.askdirectory(title="选择视频源目录")
    if dir_path:
        source_entry.delete(0, END)
        source_entry.insert(0, dir_path)


def select_target():
    # 选择保存目录
    dir_path = filedialog.askdirectory(title="选择视频保存目录")
    if dir_path:
        target_entry.delete(0, END)
        target_entry.insert(0, dir_path)


def convert_with_ffmpeg(video_m4s, audio_m4s, output_mp4):
    if os.path.getsize(video_m4s) < 0 or os.path.getsize(audio_m4s) <= 0:
        print("非法的音视频文件,{audio_m4s},视频文件:{video_m4s}")
        return False
    try:
        # 输入视频和音频
        video = ffmpeg.input(video_m4s)
        audio = ffmpeg.input(audio_m4s)

        # 构造 FFmpeg 命令
        command = [
            "ffmpeg",
            "-i", video_m4s,  # 输入视频文件
            "-i", audio_m4s,  # 输入音频文件
            '-c:v', 'copy',  # 不重新编码视频
            '-c:a', 'copy',  # 不重新编码音频
            "-y",  # 覆盖已存在的文件
            output_mp4  # 输出文件
        ]

        # 使用 subprocess.run 执行命令
        result = subprocess.run(command)

        # 检查命令是否成功执行
        if result.returncode == 0:
            print(f"{output_mp4} -> 合并成功!")
            return True
        else:
            print(f"合并失败, 视频文件:{video_m4s}, 音频文件:{audio_m4s}")
            print(f"错误信息: {result.stderr}")
            return False
    except ffmpeg.Error as e:
        print(f"合并失败,音频文件:{audio_m4s},视频文件:{video_m4s}")
        return False


def batch_convert_vedio(source_path, target_path):
    for dir in os.listdir(source_path):
        dir_path = os.path.join(source_path, dir)

        entry_file = os.path.join(dir_path, "entry.json")
        data_dir = os.listdir(dir_path).pop(0)
        audio_path = os.path.join(dir_path, data_dir, "audio.m4s")
        vedio_path = os.path.join(dir_path, data_dir, "video.m4s")

        with open(entry_file, 'r', encoding='utf-8') as f:
            entry_sjon = f.read()
            json_data = json.loads(entry_sjon)
            part_content = json_data.get("page_data", {}).get("part")
            title = json_data.get("title")

            if not os.path.exists(os.path.join(target_path, f'{title}')):
                os.makedirs(os.path.join(target_path, f'{title}'))
            target_vedio_path = os.path.join(target_path, f'{title}/{part_content}.mp4')

            convert_with_ffmpeg(vedio_path, audio_path, target_vedio_path)
            print(target_vedio_path)


def convert_video():
    source_path = source_entry.get()
    target_path = target_entry.get()

    if not source_path or not target_path:
        messagebox.showerror("错误", "请选择源目录和目标目录!")
    else:
        batch_convert_vedio(source_path, target_path)
        messagebox.showinfo("成功", f"视频将从 {source_path} 转换保存到 {target_path}")


root = Tk()
root.title("bili视频转换工具")

# 设置窗口大小并居中
window_width = 500  # 稍微加宽窗口
window_height = 200
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x = (screen_width - window_width) // 2
y = (screen_height - window_height) // 2
root.geometry(f"{window_width}x{window_height}+{x}+{y}")

# 配置网格布局权重
for i in range(5):
    root.grid_columnconfigure(i, weight=1)
for i in range(4):
    root.grid_rowconfigure(i, weight=1)

# 视频源目录选择
source_label = Label(root, text="视频源目录:")
source_label.grid(row=0, column=0, sticky="e", padx=5, pady=5)

source_entry = Entry(root)
source_entry.grid(row=0, column=1, columnspan=3, sticky="ew", padx=5, pady=5)

source_button = Button(root, text="浏览...", command=select_source)
source_button.grid(row=0, column=4, sticky="ew", padx=5, pady=5)

# 视频保存目录选择
target_label = Label(root, text="视频保存目录:")
target_label.grid(row=1, column=0, sticky="e", padx=5, pady=5)

target_entry = Entry(root)
target_entry.grid(row=1, column=1, columnspan=3, sticky="ew", padx=5, pady=5)

target_button = Button(root, text="浏览...", command=select_target)
target_button.grid(row=1, column=4, sticky="ew", padx=5, pady=5)

# 转换按钮
button_convert = Button(root, text="立即转换", command=convert_video)
button_convert.grid(row=2, column=1, columnspan=3, sticky="ew", padx=50, pady=20)

# 进入消息循环
root.mainloop()

具体效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_天气预报日历示例(CalendarView01_18)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

【机器学习】主成分分析 (PCA)

目录 一、基本概念 二、数学推导 2.1 问题设定&#xff1a;寻炸最大方差的投影方向 2.2 数据中心化 2.3 目标函数&#xff1a;最大化投影后的方差 2.4 约束条件 2.5 拉格朗日乘子法 ​编辑 2.6 主成分提取 2.7 降维公式 三、SVD 四、实际案例分析 一、基本概念 主…

二叉树-104.二叉树的最大深度-力扣(LeetCode)

一、题目解析 这里需要注意根节点的深度是1&#xff0c;也就是说计算深度的是从1开始计算的 二、算法原理 解法1&#xff1a;广度搜索&#xff0c;使用队列 解法2&#xff1a;深度搜索&#xff0c;使用递归 当计算出左子树的深度l&#xff0c;与右子树的深度r时&#xff0c;…

物料转运人形机器人适合应用于那些行业?解锁千行百业的智慧物流革命

当传统物流设备困于固定轨道&#xff0c;当人力搬运遭遇效率与安全的天花板&#xff0c;物料转运人形机器人正以颠覆性姿态重塑产业边界。富唯智能凭借GRID大模型驱动的"感知-决策-执行"闭环系统&#xff0c;让物料流转从机械输送升级为智慧调度——这不仅是工具的革…

时序预测模型测试总结

0.背景描述 公司最近需要在仿真平台上增加一些AI功能&#xff0c;针对于时序数据&#xff0c;想到的肯定是时序数据处理模型&#xff0c;典型的就两大类&#xff1a;LSTM 和 tranformer 。查阅文献&#xff0c;找到一篇中石化安全工程研究院有限公司的文章&#xff0c;题目为《…

第四十五天打卡

知识点回顾&#xff1a; tensorboard的发展历史和原理 tensorboard的常见操作 tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策略下&#xff0c;用tensor…

springboot mysql/mariadb迁移成oceanbase

前言&#xff1a;项目架构为 springbootmybatis-plusmysql 1.部署oceanbase服务 2.springboot项目引入oceanbase依赖&#xff08;即ob驱动&#xff09; ps&#xff1a;删除原有的mysql/mariadb依赖 <dependency> <groupId>com.oceanbase</groupId> …

npm install 报错:npm error: ...node_modules\deasync npm error command failed

npm install 时报错如下&#xff1a; 首先尝试更换node版本&#xff0c;当前node版本20.15.0&#xff0c;更换node版本为16.17.0。再次执行npm install安装成功

Filebeat收集nginx日志到elasticsearch,最终在kibana做展示(二)

EFK 项目需求是要将 一天或15分钟内 搜索引擎抓取网站次数做个统计&#xff0c;并且 如 200 301 404 状态码 也要区分出来, 访问 404 报错的 url 也要截取出来 前期 收集数据 看这篇文章&#xff0c;点击跳转 收集数据完成之后&#xff0c;使用下面方法做展示 创建一个 仪表…

halcon c# 自带examples报错 Matching

最近开始学习halcon与C#的联合编程&#xff0c;打开Matching例程时遇到了下面的问题 “System.TypeInitializationException”类型的未经处理的异常在 halcondotnet.dll 中发生 “HalconDotNet.HHandleBase”的类型初始值设定项引发异常。 System.TypeInitializationExceptio…

服务器重启后配置丢失怎么办?

服务器重启后配置丢失是一个常见问题&#xff0c;特别是在云服务器或容器环境中&#xff0c;若未正确保存或持久化配置&#xff0c;系统重启后就会恢复默认状态。下面是问题分析 解决方案&#xff1a; &#x1f9e0; 一、常见原因分析 原因描述❌ 配置保存在临时目录如 /tmp、…

湖北理元理律所债务优化实践:法律技术与人文关怀的双轨服务

一、债务优化的法律逻辑与生活平衡 在债务重组领域&#xff0c;专业机构需同时解决两个核心问题&#xff1a; 法律合规性&#xff1a;依据《民法典》第680条、第671条&#xff0c;对高息债务进行合法性审查&#xff1b; 生活可持续性&#xff1a;根据债务人收入设计分期方案…

Springboot——整合websocket并根据type区别处理

文章目录 前言架构思想项目结构代码实现依赖引入自定义注解定义具体的处理类定义 TypeAWebSocketHandler定义 TypeBWebSocketHandler 定义路由处理类配置类&#xff0c;绑定point制定前端页面编写测试接口方便跳转进入前端页面 测试验证结语 前言 之前写过一篇类似的博客&…

Qiskit:量子计算模拟器

参考文献&#xff1a; IBM Qiskit 官网Qiskit DocumentationQiskit Benchpress packageQiskit Algorithms package量子计算&#xff1a;基本概念常见的几类矩阵&#xff08;正交矩阵、酉矩阵、正规矩阵等&#xff09;Qiskit 安装指南-博客园使用Python实现量子电路模拟&#x…

龙虎榜——20250605

上证指数放量收阳线&#xff0c;个股涨跌基本持平&#xff0c;日线持续上涨。 深证指数放量收阳线&#xff0c;日线持续上涨。 2025年6月5日龙虎榜行业方向分析 1. 通信设备 代表标的&#xff1a;生益电子、三维通信、瑞可达 驱动逻辑&#xff1a;5.5G商用牌照发放预期加速&…

残月个人拟态主页

TwoMicry个人主页 残月个人拟态主页 原项目作者&#xff1a;KAI GE 在此基础上进行二次修改 精简重构一下 项目简介&#xff1a; 一个精美的拟态风格个人主页&#xff0c;采用现代化的玻璃拟态设计和丰富的动画效果 主要特色&#xff1a; 视觉效果&#xff1a; – 玻璃…

热门消息中间件汇总

文章目录 前言RabbitMQ基本介绍核心特性适用场景 Kafka基本介绍核心特性适用场景 RocketMQ基本介绍核心特性适用场景 NATS基本介绍核心特性适用场景 总结选型建议与未来趋势选型建议未来趋势 结语 前言 大家后&#xff0c;我是沛哥儿。作为技术领域的老湿机&#xff0c;在消息…

AiPy实战:10分钟用AI造了个音乐游戏!

“在探索AI编程边界时&#xff0c;我尝试了一个实验&#xff1a;能否让自然语言指令直接生成可交互的音乐学习应用&#xff1f;作为新一代智能编程协作框架&#xff0c;AiPy展示了对开发意图的深度理解能力——当输入创建钢琴学习游戏&#xff0c;包含动态难度关卡和即时反馈系…

贪心算法应用:分数背包问题详解

贪心算法与分数背包问题 贪心算法&#xff08;Greedy Algorithm&#xff09;是算法设计中一种重要的思想&#xff0c;它在许多经典问题中展现出独特的优势。本文将用2万字篇幅&#xff0c;深入剖析贪心算法在分数背包问题中的应用&#xff0c;从基础原理到Java实现细节&#x…

PHP舆情监控分析系统(9个平台)

PHP舆情监控分析系统&#xff08;9个平台&#xff09; 项目简介 基于多平台热点API接口的PHP实时舆情监控分析系统&#xff0c;无需数据库&#xff0c;直接调用API实时获取各大平台热点新闻&#xff0c;支持数据采集、搜索和可视化展示。 功能特性 &#x1f504; 实时监控 …