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"  # 修改为你的实际路径

OK!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新版 (持续更新)docker 加速源 linux yum 源

收藏两个网站&#xff0c;配置docker 加速源与yum 源。 docker 加速源链接 Docker/DockerHub 国内镜像源/加速列表&#xff08;2月25日更新-长期维护&#xff09;-腾讯云开发者社区-腾讯云https://cloud.tencent.com/developer/article/2485043 yum 源 CentOS7停服后yum源配置…

计算机三级网络技术备考(2)

#第二章关于中小型网络系统总体规划与设计方法 考点一&#xff1a;网络总体设计 考点二网络关键设备选型 考点三服务器的选型 #第三章&#xff1a;IP地址规划设计技术 考点1&#xff1a;二进制和十进制转换 小练习记得做昂 考点2&#xff1a;IP地址分类及规划方法 A类&#x…

【代码软件 | vs2019】vs2019+Qt5.12.12开发环境 的下载、安装详细介绍

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【DeepSeek探索篇(四)】高效学习与工作,从搭建DeepSeek个人知识库开始!

高效学习与工作&#xff0c;从搭建DeepSeek个人知识库开始&#xff01; 打工人和学习者必看&#xff01;你为何急需一个个人知识库&#xff1f;搭建个人知识库需要用到哪些技术呢&#xff1f;一、模型微调与RAG技术简介二、RAG技术原理剖析 揭秘Embedding&#xff1a;为何它是D…

AI数字人系统源码部署解决方案!!!

一、开场白 如今&#xff0c;科技的步伐越来越快&#xff0c;数字人已经从想象中走进了我们的现实生活。它们在娱乐、教育、医疗等多个领域大放异彩。了解数字人的代码开发技术&#xff0c;能让我们更好地理解其工作原理&#xff0c;为那些想在这一领域大展拳脚或者用数字人技…

【网络】HTTPS协议原理

文章目录 1. HTTPS 是什么2. 常见的加密方式3. 数据摘要4. 加密方案测试4.1 只是用对称加密4.2 只使用非对称加密4.3 双方都使用非对称加密4.4 对称 非对称 5. 证书5.1 数据签名5.2 CA 证书5.3 方案五 非对称加密 对称加密 证书认证 1. HTTPS 是什么 HTTP 协议内容都是按照…

计算机网络————(三)

前文二 前文一 Websocket协议 是一种存在TCP协议之上的协议 当客户端需要了解服务器是否更新就需要不断给客户端发送请求询问是否更新&#xff0c;这行会造成服务端压力很大 而Websocket相当于服务器一旦更新了就会给客户端发送消息表明自己更新了&#xff0c;类似客户端订阅…

Blueprint —— Events

目录 一&#xff0c;Event Level Reset 二&#xff0c;Event Actor Begin Overlap 三&#xff0c;Event Actor End Overlap 四&#xff0c;Event Hit 五&#xff0c;Event Any Damage 六&#xff0c;Event Point Damage 七&#xff0c;Event Radial Damage 八&#xff…

博云先进算力管理平台AIOS已上线全尺寸DeepSeek系列模型

在异构基础设施上轻松运行全尺寸DeepSeek DeepSeek于2024年12月发布了包括 DeepSeek V3、R1、Janus Pro等多版本模型。V3版本适用于通用型自然语言处理任务&#xff0c;R1专注于复杂推理任务&#xff0c;而 Janus Pro 则擅长多模态理解与生成&#xff0c;可满足企业不同 AI 场…

如何搭建起成熟的团队知识文档管理系统

搭建一个成熟的团队知识文档管理系统&#xff0c;对于提升团队的工作效率、促进信息共享以及保障知识资产的安全性都至关重要。**要实现这一目标&#xff0c;首先需要明确知识管理的目标和需求&#xff0c;其次选择合适的知识管理工具&#xff0c;最后制定有效的管理流程和权限…

0-基于强化学习的图Transformer算法求解车辆路径问题(2023)

文章目录 Abstract1 Introduction2. Related Work2.1 引言2.2.基于RNN的VRP解决方案2.3.基于GNN的VRP解决方案2.4.基于Transformer的车辆路径问题求解方法3 边嵌入注意力模型3.1 编码器3.1.1 边嵌入多头注意力3.1.2. 前馈网络(FFN)、批量归一化和残差连接3.2 解码器3.2.1 解码…

C#快速调用DeepSeek接口,winform接入DeepSeek查询资料 C#零门槛接入DeepSeek C#接入DeepSeek源代码下载

下载地址<------完整源码 在数字化转型加速的背景下&#xff0c;企业应用系统对智能服务的需求日益增长。DeepSeek作为先进的人工智能服务平台&#xff0c;其自然语言处理、图像识别等核心能力可显著提升业务系统的智能化水平。传统开发模式下&#xff0c;C#开发者需要耗费大…

有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2

https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package

深度神经网络(DNN)编译器原理简介

深度神经网络(DNN)编译器原理简介 目录 深度神经网络(DNN)编译器原理简介1 什么是DNN编译器2 前端3 后端4 中间表达&#xff08;Intermediate Representation&#xff0c;后文用IR代替&#xff09;5 优化过程6 计算图优化6.1 表达式化简6.2 公共子表达式消除6.3 常数传播6.4 矩…

最小二乘法与梯度下降(原理)

一、最小二乘法 损失函数矩阵形式&#xff1a; 令导数loss0 &#xff0c;可解得&#xff1a; API : sklearn.linear_model.LinearRegression() 功能&#xff1a; 普通最小二乘法线性回归, 权重和偏置是直接算出来的&#xff0c;对于数量大的不适用&#xff0c;因为计算量…

【2025全网最新最全】前端Vue3框架的搭建及工程目录详解

文章目录 安装软件Node.js搭建Vue工程创建Vue工程精简Vue项目文件 Vue工程目录的解读网页标题的设置设置全局样式路由配置 安装软件Node.js 下载地址&#xff1a;https://nodejs.org/zh-cn/ 安装完成后&#xff0c;打开cmd,查看环境是否准备好 node -v npm -vnpm使用之前一定…

Java 之集成 DataX 数据同步工具

1、官网下载 DataX https://github.com/alibaba/DataX 2、将依赖添加到本地&#xff08;DataX没有maven坐标&#xff0c;需要自己安装&#xff09; mvn install:install-file -Dfile"datax-common-0.0.1.jar" "-DgroupIdcom.datax" "-DartifactIdda…

OpenEuler学习笔记(三十五):搭建代码托管服务器

以下是主流的代码托管软件分类及推荐&#xff0c;涵盖自托管和云端方案&#xff0c;您可根据团队规模、功能需求及资源情况选择&#xff1a; 一、自托管代码托管平台&#xff08;可私有部署&#xff09; 1. GitLab 简介: 功能全面的 DevOps 平台&#xff0c;支持代码托管、C…

pikachu

暴力破解 基于表单的暴力破解 【2024版】最新BurpSuit的使用教程&#xff08;非常详细&#xff09;零基础入门到精通&#xff0c;看一篇就够了&#xff01;让你挖洞事半功倍&#xff01;_burpsuite使用教程-CSDN博客 登录页面&#xff0c;随意输入抓包&#xff0c;发送到攻击…

Springboot基础篇(3):Bean管理

前言&#xff1a;Spring 通过扫描类路径&#xff08;Classpath&#xff09;来查找带有特定注解&#xff08;如 Component、Service、Repository 等&#xff09;的类&#xff0c;并将它们注册为 Spring 容器中的 Bean。 1 Bean扫描 Bean 扫描是 Spring 框架的核心功能之一&…