Windows版FFmpeg使用及B站视频下载示例python源码
Windows版FFmpeg使用及B站视频下载示例python源码
FFmpeg介绍和下载
FFmpeg 是一个功能强大、灵活且广泛使用的多媒体处理工具,无论是在专业领域还是日常使用中,都能满足各种多媒体处理需求。FFmpeg 是一个开源项目,遵循 LGPL 或 GPL 许可。这意味着你可以免费使用、修改和分发它。组成:
ffmpeg:这是 FFmpeg 的核心工具,用于处理多媒体文件的转换、录制、播放等操作。
ffplay:一个简单的多媒体播放器,用于播放视频和音频文件。
ffprobe:用于分析多媒体文件的元数据,例如文件格式、编码信息、时长等。
FFmpeg 支持几乎所有常见的视频和音频格式,如 MP4、AVI、MKV、MOV、WAV、MP3、FLV 等。它还支持多种编解码器,如 H.264、H.265、AAC、MP3 等。
使用方式
FFmpeg 是一个命令行工具,可以通过命令行参数来执行各种操作。例如:
转换格式:ffmpeg -i input.mp4 -c:v libx264 output.avi
提取音频:ffmpeg -i video.mp4 -q:a 0 -map a audio.mp3
常用参数
输入输出相关
-i <input>:指定输入文件。
-f <format>:强制指定输入或输出文件格式。
-y:自动覆盖输出文件。
-n:禁止覆盖输出文件。
编码器和解码器
-c:v <codec>:指定视频编解码器。
-c:a <codec>:指定音频编解码器。
-c copy:直接拷贝流,不进行重新编码。
更多情况可见https://ffmpeg.org/ffmpeg.html#Trancoding
也可以通过编程接口(如Python、C/C++)调用其功能,方便集成到其他软件中。
Windows版本的FFmpeg下载
打开 FFmpeg 官网https://ffmpeg.org/,选择Download(下载)。
选择左边的 release builds(发布版本)
可以选择下载上面红色圈中的 release-full 版本,
选择带 shared 的还是不带 shared 的版本,其实都是可以的。
下载后,解压使用。解压进入 bin 目录
带 shared 的里面,多了 include、lib 目录。把 FFmpeg 依赖的模块包单独的放在的 lib 目录中。ffmpeg.exe,ffplay.exe,ffprobe.exe 作为可执行文件的入口,文件体积很小,他们在运行的时候,如果需要,会到 lib 中调用相应的功能。
不带 shared 的里面,bin 目录中有 ffmpeg.exe,ffplay.exe,ffprobe.exe 三个可执行文件,每个 exe 的体积都稍大一点,因为它已经把相关的需要用的模块包编译到exe里面去了。不带 shared 的版本,单文件可以方便使用。
python代码bilibili(B站)下载示例源码
下面给出bilibili(B站)上西游记精彩花絮
https://www.bilibili.com/video/BV1gX4y1P7Va/?spm_id_from=333.788.recommend_more_video.10
使用python及第三方模块requests实现
先介绍代码中使用的模块
requests模块。这个模块是用来发送HTTP请求的,比如GET、POST等,非常常用。方便与 Web API 进行交互。requests是第三方库,不是Python的标准库,需要额外安装,通常用pip install requests来安装。所以这个需要用户自己安装。
json模块。这个模块用于处理JSON数据,比如解析和生成JSON。例如将 Python 字典转换为 JSON 字符串,或将 JSON 字符串解析为 Python 对象。json是Python的内置库,从Python 2.6开始就存在了,所以不需要安装。
pprint模块,全称是Pretty Print,用于美化输出数据结构,比如字典和列表,使其更易读。这个也是Python的标准库,属于内置模块,不需要安装。
re模块,正则表达式模块,支持字符串匹配、搜索、替换等操作,常用于文本处理和模式匹配。。同样,这是Python内置的,无需安装。
os模块,提供了与操作系统交互的功能,比如文件和目录操作、环境变量等。是内置的,不需要额外安装。
subprocess模块,用于运行外部命令或程序。允许生成新的进程,连接输入/输出/错误管道,并获取返回码。是Python标准库的一部分,不需要安装。
sys模块,提供对Python解释器相关的操作,比如访问命令行参数、退出程序、获取模块路径等。属于内置模块,无需安装。
urllib.parse.urlparse。urllib.parse是用于处理URL的模块,urlparse是其中的一个函数,用来解析URL。urllib是Python的标准库,所以不需要安装。在Python 3中,urllib被分成了几个子模块,比如urllib.request、urllib.parse等。
代码逻辑如下:
发送HTTP请求获取网页内容。
从网页内容中解析出视频和音频的URL。
下载视频和音频文件。
使用FFmpeg工具合并视频和音频文件。
注意,该代码通用性极低,不能下载B站所有视频,仅能下载B站未加密、无分片(如.m3u8索引文件)、非会员/付费的公开视频。
源码如下:
import requests
import json
import pprint
import re
import os
import subprocess
import sys
from urllib.parse import urlparse# 全局常量定义
SAVE_DIR = r'D:\bilibili' #视频存放路径设置
FFMPEG_PATH = r'D:\ffmpeg-7.1-full_build\bin\ffmpeg.exe' # 修改为实际路径
ILLEGAL_CHARS = r'[<>:"/\\|?*\x00-\x1F]'def clean_filename(filename):"""清理文件名中的非法字符"""return re.sub(ILLEGAL_CHARS, '_', filename).strip()def getResponse(url):"""获取url响应体(带重试机制)"""# 设置请求头以模拟浏览器访问headers = {'referer': 'https://www.bilibili.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'}try:response = requests.get(url=url, headers=headers, timeout=20)response.raise_for_status()return responseexcept RequestException as e:raise RuntimeError(f"网络请求失败: {str(e)}") from edef parseResponse(url):"""解析响应体"""try:# 验证域名if 'bilibili.com' not in urlparse(url).netloc:raise ValueError("非B站视频链接")response = getResponse(url)# 提取视频信息html_data_match = re.search(r'<script>window\.__playinfo__=(.*?)</script>', response.text)if not html_data_match:raise ValueError("未找到视频数据")try:jsonData = json.loads(html_data_match.group(1))except json.JSONDecodeError as e:raise ValueError("视频数据解析失败") from e# 提取标题title_match = re.search(r'<title data-vue-meta="true">(.*?)</title>', response.text)if not title_match:raise ValueError("未找到视频标题")videoTitle = clean_filename(title_match.group(0).split('>')[1].split('<')[0])# 验证媒体流数据try:audioUrl = jsonData['data']['dash']['audio'][0]['baseUrl']videoUrl = jsonData['data']['dash']['video'][0]['baseUrl']except (KeyError, IndexError) as e:raise ValueError("视频流信息不完整") from ereturn {'videoTitle': videoTitle,'audioUrl': audioUrl,'videoUrl': videoUrl,}except Exception as e:raise RuntimeError(f"解析响应失败: {str(e)}") from edef saveMedia(fileName, content, mediaType):"""保存媒体文件"""try:os.makedirs(SAVE_DIR, exist_ok=True)safe_name = f"{clean_filename(fileName)}.{mediaType}"full_path = os.path.join(SAVE_DIR, safe_name)with open(full_path, 'wb') as f:f.write(content)print(f"[√] {mediaType.upper()}保存成功: {safe_name}")return full_pathexcept (IOError, OSError) as e:raise RuntimeError(f"文件保存失败: {str(e)}") from edef AvMerge(Mp3Path, Mp4Path, savePath):"""合并音视频"""try:if not os.path.isfile(FFMPEG_PATH):raise FileNotFoundError("FFmpeg路径不存在")print("[!] 开始合并音视频...")cmd = [FFMPEG_PATH,'-y', # 覆盖输出文件'-i', Mp4Path,'-i', Mp3Path,'-c:v', 'copy','-c:a', 'aac','-strict', 'experimental',savePath]try:subprocess.run(cmd,check=True,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)except subprocess.CalledProcessError as e:raise RuntimeError(f"合并失败(错误码 {e.returncode})") from eprint(f"[√] 合并完成: {os.path.basename(savePath)}")# 清理临时文件for path in [Mp3Path, Mp4Path]:try:if os.path.exists(path):os.remove(path)print(f"[!] 已清理临时文件: {os.path.basename(path)}")except Exception as e:print(f"[!] 清理文件失败: {str(e)}")except Exception as e:raise RuntimeError(f"合并过程出错: {str(e)}") from edef main():try:url = input("请输入B站视频url地址: ").strip()if not url.startswith(('http://', 'https://')):raise ValueError("请输入有效的URL地址")videoInfo = parseResponse(url)base_name = videoInfo['videoTitle']# 下载音频audio_content = getResponse(videoInfo['audioUrl']).contentmp3_path = saveMedia(base_name, audio_content, 'mp3')# 下载视频video_content = getResponse(videoInfo['videoUrl']).contentmp4_path = saveMedia(base_name, video_content, 'mp4')# 合并文件merged_path = os.path.join(SAVE_DIR, f'merged_{base_name}.mp4')AvMerge(mp3_path, mp4_path, merged_path)print(f"[√] 全部操作已完成!保存路径: {merged_path}")except Exception as e:print(f"[X] 程序运行出错: {str(e)}")sys.exit(1)if __name__ == '__main__':main()
说明:
其中,代码行:FFMPEG_PATH = r"D:\ffmpeg-7.1-full_build\bin\ffmpeg.exe" # 修改为你的实际路径
若使用不带 shared 的版本,可将bin 目录中的 ffmpeg.exe文件,直接拷贝到这个程序的文件夹中,可将其改为:FFMPEG_PATH = r".\ffmpeg.exe" # 修改为你的实际路径
附、Python网络爬虫入门 https://blog.csdn.net/cnds123/article/details/121868887
OK!
相关文章:

Windows版FFmpeg使用及B站视频下载示例python源码
Windows版FFmpeg使用及B站视频下载示例python源码 FFmpeg介绍和下载 FFmpeg 是一个功能强大、灵活且广泛使用的多媒体处理工具,无论是在专业领域还是日常使用中,都能满足各种多媒体处理需求。FFmpeg 是一个开源项目,遵循 LGPL 或 GPL 许可。…...
leetcode_动态规划/递归 509. 斐波那契数
509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1F(n) F(n - 1) F(n - 2),其中 n …...

对泰坦尼克号沉没事件幸存者数据分析和预测
一、分析目的 探究决定泰坦尼克号沉没事件中什么因素决定着船上人的生死,并对实例进行判别和预测。 二、数据介绍 Titanic.csv数据中包含了891个样本,记录了泰坦尼克号遇难时的891个乘客的基本信息,其中包括以下信息: Passenger…...
算法之排序算法
排序算法 ♥常见排序算法知识体系详解♥ | Java 全栈知识体系 算法 - 排序 | CS-Notes 面试笔记 十大经典排序算法总结 | JavaGuide...
DMA发送全部历史记录数据到串口
背景 博主参与的项目中,有个读取全部历史记录的功能,如果下位机在主程序中将全部历史记录单纯地通过串口传输会比较占用cpu资源,影响主程序中别的功能。最后商量得出以下实现方案: 定义两个发送缓冲区DMATxbuf1和DMATxbuf2&…...

蓝桥杯好题推荐-----高精度减法
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 题目链接 记录详情 - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/record/205122671 思路讲解 这个题目的解题思路,其实是和高精度加法是非常像的。怎么说…...

SpringMVC (3)
目录 1. 传递对象 2. 后端参数重命名(后端参数映射) 3. 传递数组 4. 传递集合 5. 传递JSON数据 5.1 JSON概念 5.2 JSON语法 5.3 JSON字符串和Java对象互转 5.4 JSON优点 5.5 传递JSON对象 6. 获取URL中参数PathVariable 7. 上传文件RequestP…...

vscode使用豆包MARSCode----集成doubao1.5 DeepSeekR1 DeepseekV3模型的ai编程插件
引入扩展 打开VSCode扩展窗口,在搜索窗口搜索MarsCode,找到MarsCode 插件单击「install」,完成安装,登录即可使用MarsCode 编程助手。 主要功能 主要快捷键 / explain 解释项目代码,AI 返回的内容有结构分类&#…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_buf_t
ngx_buf_t 定义在 src/core/ngx_buf.h typedef struct ngx_buf_s ngx_buf_t;struct ngx_buf_s {u_char *pos;u_char *last;off_t file_pos;off_t file_last;u_char *start; /* start of buffer */u_char …...

分布式开源协调服务之zookeeper
Zookeeper简介 Zookeeper是什么? Zookeeper官网中对Zookeeper的定义还是比较明确的: ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services…...
ubuntu系统安装playhouse三方库
ubuntu系统python3.10安装playhouse三方库 问题描述 问题描述 虚拟环境中使用pip install playhouse,返回安装成功 用pip list查看,能看到playhouse及版本号 导包时提示没有找到playhouse我那件目录,能发现 检查site-package发现问题&#x…...

【星云 Orbit-F4 开发板】04.一触即发:GPIO 外部中断
【星云 Orbit-F4 开发板】04. 一触即发:外部中断控制 摘要 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能。通过配置GPIO引脚作为外部中断源,并在中断回调函数中处理按键事件,实现了按键控制LED状态翻转的功能。本文旨在…...

笔记二:整数和浮点数在内存中存储
目录 一、数据类型介绍 二、类型的基本归类 1.整形家族: 2.浮点数家族: 3.构造类型: 4.指针类型 5.空类型: 三、整形在内存中的存储 3.1 原码,反码、补码 3.2 大小端介绍 四、浮点数在内存中的存储 编辑 4.…...

PyQT(PySide)的上下文菜单策略设置setContextMenuPolicy()
在 Qt 中,QWidget 类提供了几种不同的上下文菜单策略,这些策略通过 Qt::ContextMenuPolicy 枚举类型来定义,用于控制控件(如按钮、文本框等)在用户右键点击时如何显示上下文菜单。 以下是 Qt::ContextMenuPolicy 枚举中…...

BladeX框架接口请求跨域
前端使用代理请求接口,接口可以正常访问。如果换全路径请求就跨域。 除了后端要配置跨域 还需要修改配置文件对OPTIONS请求的限制...

如何在Apple不再支持的MacOS上安装Homebrew
手头有一台2012年产的Macbook Pro,系统版本停留在了10.15.7(2020年9月24日发布的)。MacOS 11及后续的版本都无法安装到这台老旧的电脑上。想通过pkg安装Homebrew,发现Homebrew releases里最新的pkg安装包不支持MacOS 10.15.7&…...

本地大模型编程实战(26)用langgraph实现基于SQL数据构建的问答系统(5)
本文将将扩展上一篇文章完成的 langgraph 链,继续使用基于 langgraph 链 ,对结构化数据库 SQlite 进行查询的方法。该系统建立以后,我们不需要掌握专业的 SQL 技能,可以用自然语言询问有关数据库中数据的问题并返回答案。主要完善…...
数据结构与算法:滑动窗口
前言 滑动窗口一般主要用于解决子数组或子串问题,这类的题目更看重对题目的分析和转化。 一、原理 在整个数组上,用l和r分别控制窗口的左右边界,r就扩大,l就减小。 当窗口的范围和题目中某个指标间存在单调关系时,…...

江协科技/江科大-51单片机入门教程——P[2-1] 点亮一个LED
本节将向大家介绍如何用 51 单片机去控制开发板上的 LED。开发板上的 LED 位置标注有 “LED 模块”。 第二章要写 3 个程序代码:第一个代码实现点亮开发板上的第一个 LED;第二个代码让第一个 LED 以 1 秒为周期闪烁;第三个代码使 8 个 LED 以…...
leetcode hot 100 41. 缺失的第一个正数
代码 测试用例 测试用例 测试结果 41. 缺失的第一个正数 已解答 困难 相关标签 相关企业 提示 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...

边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...