{"skill":{"slug":"xiaomi-touchscreen-alarm-clock-video-production","displayName":"小米触屏闹钟视频制作","summary":"B站视频下载裁剪压缩工具。下载bilibili视频、裁剪去除边框、压缩到指定大小时使用。支持b23.tv短链和BV号。别名：闹钟视频下载。","description":"---\nname: bilibili-video-download\ndescription: B站视频下载裁剪压缩工具。下载bilibili视频、裁剪去除边框、压缩到指定大小时使用。支持b23.tv短链和BV号。别名：闹钟视频下载。\n---\n\n# 闹钟视频下载\n\n## 依赖\n\n- yt-dlp: `py -m pip install yt-dlp`\n- bilix (备用): `pip install bilix --break-system-packages`\n- ffmpeg/ffprobe: 需在PATH中\n\n## 工作流\n\n### 1. 下载视频\n\n#### 方法A: yt-dlp（推荐，但可能遇到反爬虫）\n\n固定下载720P分辨率视频（格式ID: 30064+30280），文件名使用BV号：\n```\npy -m yt_dlp -f \"30064+30280\" -o \"PATH/%(id)s.%(ext)s\" --merge-output-format mp4 URL\n```\n说明: 30064为720P视频流,30280为音频流。使用 `%(id)s` 自动提取BV号作为文件名，避免多个视频下载时文件名冲突。\n\n**注意:** yt-dlp 可能遇到 HTTP 412 错误（B站反爬虫机制），此时使用方法B。\n\n#### 方法B: bilix（备用，稳定性更好）\n\n当 yt-dlp 返回 `HTTP Error 412: Precondition Failed` 时，使用 bilix 下载：\n```bash\npip install bilix --break-system-packages\nbilix get_video \"https://www.bilibili.com/video/BV号\" -d 输出目录\n```\n\n**b23.tv短链处理:** bilix 不直接支持短链，需先解析获取BV号：\n```bash\ncurl -sI \"https://b23.tv/短链ID\" | grep -i location\n# 从返回的location中提取BV号\n```\n\n### 2. 裁剪边框（可选）\n\n使用裁剪参数去除B站视频边框，格式为 `宽:高:左:上`。\n\n#### 720P视频固定参数\n\n默认裁剪参数 `792:600:432:56`（针对1280x720视频）：\n```\nffmpeg -y -i IN -vf \"crop=792:600:432:56\" -c:v libx264 -crf 18 -c:a copy OUT\n```\n\n#### 非720P视频裁剪参数计算\n\n720P裁剪参数的比例：\n| 参数 | 720P值 | 比例 |\n|------|--------|------|\n| 裁剪宽度 | 792 | 61.875% (0.61875) |\n| 裁剪高度 | 600 | 83.33% (0.83333) |\n| 左偏移 | 432 | 33.75% (0.3375) |\n| 上偏移 | 56 | 7.78% (0.07778) |\n\n**通用计算公式：**\n```python\nvideo_width = 852   # 实际视频宽度\nvideo_height = 480  # 实际视频高度\n\ncrop_w = int(video_width * 0.61875)   # 裁剪宽度\ncrop_h = int(video_height * 0.83333)  # 裁剪高度\ncrop_x = int(video_width * 0.3375)    # 左偏移\ncrop_y = int(video_height * 0.07778)  # 上偏移\n\n# 结果: crop=527:400:287:37\n```\n\n**常见分辨率适配参数：**\n\n| 分辨率 | 裁剪参数 | 输出尺寸 |\n|--------|---------|---------|\n| 1280x720 (720P) | `792:600:432:56` | 792x600 |\n| 1920x1080 (1080P) | `1188:900:648:84` | 1188x900 |\n| 852x480 | `527:400:287:37` | 527x400 |\n| 640x360 (360P) | `396:300:216:28` | 396x300 |\n\n**裁剪命令示例（852x480视频）：**\n```\nffmpeg -y -i IN -vf \"crop=527:400:287:37\" -c:v libx264 -crf 18 -c:a copy OUT\n```\n\n如无需裁剪，传入 `--no-crop`。\n\n### 3. 剪切视频（可选，默认去除前后各10秒）\n\n**步骤1: 去除前10秒**\n```\nffmpeg -y -i IN -ss 00:00:10 -c:v libx264 -crf 18 -c:a copy TEMP\n```\n\n**步骤2: 获取剩余视频时长**\n```\nffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 TEMP\n```\n\n**步骤3: 去除后10秒（总时长-10）**\n```\nffmpeg -y -i TEMP -t (duration-10) -c:v libx264 -crf 18 -c:a copy OUT\n```\n\n说明: 固定去除片头10秒和片尾10秒，总时长减少20秒。如无需剪切，传入 `--no-trim`。\n\n### 4. 压缩到目标大小\n\n**目标：压缩到10MB以内**\n\n**步骤1: 获取视频时长**\n```\nffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 INPUT_VIDEO\n```\n\n**步骤2: 计算动态码率**\n使用Python计算码率参数（以目标10MB为例）：\n```python\ntarget_MB = 10\nduration = 217.345783  # 从步骤1获取的实际时长\nvbr = max(int((target_MB * 0.9 * 8 * 1024) / duration - 64), 100)  # 视频码率\nmaxrate = int(vbr * 1.25)  # 最大码率\nbufsize = int(vbr * 2.5)   # 缓冲大小\n# 示例输出: vbr=275k, maxrate=344k, bufsize=688k\n```\n\n计算公式：\n- 视频码率: `vbr = max(int((target_MB * 0.9 * 8 * 1024) / duration - 64), 100)`\n- 最大码率: `maxrate = int(vbr * 1.25)`\n- 缓冲大小: `bufsize = int(vbr * 2.5)`\n\n**步骤3: 执行压缩**\n```\nffmpeg -y -i INPUT_VIDEO -c:v libx264 -b:v 275k -maxrate 344k -bufsize 688k -c:a aac -b:a 64k -ar 44100 OUTPUT_VIDEO\n```\n\n**验证压缩结果:**\n```\nffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 OUTPUT_VIDEO\n```\n\n**实际案例参考:**\n- 输入视频: 792x600, 时长217秒, 约22.4MB\n- 压缩参数: vbr=275k, maxrate=344k, bufsize=688k\n- 输出结果: 约9.0MB, 成功压缩到10MB以内\n\n### 5. 一键脚本\n\n```\npy scripts/download_and_process.py URL [选项]\n```\n\n**必选参数:**\n- `url` — B站视频URL（支持BV号、b23.tv短链）\n\n**可选参数:**\n\n| 参数 | 默认值 | 说明 |\n|------|--------|------|\n| `--format_id` | `30064+30280` | 下载格式ID |\n| `--crop` | `792:600:432:56` | 裁剪参数（宽:高:左:上） |\n| `--no-crop` | — | 跳过裁剪步骤 |\n| `--no-trim` | — | 跳过去头尾步骤（默认去除前后各10秒） |\n| `--max_size_mb` | `10` | 目标文件大小（MB） |\n| `--filename` | 自动从URL提取 | 输出文件名（不含扩展名） |\n| `--output_dir` | `Documents` | 输出目录 |\n\n**使用示例:**\n```bash\n# 默认处理（下载→裁剪→去头尾→压缩）\npy scripts/download_and_process.py \"https://www.bilibili.com/video/BV1m24y1d7xw\"\n\n# 不裁剪，直接去头尾并压缩\npy scripts/download_and_process.py \"https://www.bilibili.com/video/BV1m24y1d7xw\" --no-crop\n\n# 不去头尾，只裁剪并压缩\npy scripts/download_and_process.py \"https://www.bilibili.com/video/BV1m24y1d7xw\" --no-trim\n\n# 完全不裁剪也不去头尾\npy scripts/download_and_process.py \"https://www.bilibili.com/video/BV1m24y1d7xw\" --no-crop --no-trim\n\n# 自定义裁剪区域\npy scripts/download_and_process.py \"https://www.bilibili.com/video/BV1m24y1d7xw\" --crop \"800:600:240:60\"\n\n# 压缩到20MB以内\npy scripts/download_and_process.py \"https://www.bilibili.com/video/BV1m24y1d7xw\" --max_size_mb 20\n```\n\n脚本自动依次执行：下载 → [裁剪] → [去头去尾] → 压缩到目标大小（中括号为可选步骤）\n\n### 6. 手动处理流程（当脚本失败时）\n\n当 yt-dlp 遇到反爬虫限制时，使用以下手动流程：\n\n```bash\n# 1. 安装 bilix\npip install bilix --break-system-packages\n\n# 2. 解析短链获取BV号（如果是b23.tv短链）\ncurl -sI \"https://b23.tv/短链ID\" | grep -i location\n\n# 3. 下载视频\nbilix get_video \"https://www.bilibili.com/video/BV号\" -d 输出目录\n\n# 4. 获取视频分辨率\nffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 视频文件\n\n# 5. 计算裁剪参数（根据分辨率）\n# 使用公式: crop_w=width*0.61875, crop_h=height*0.83333, crop_x=width*0.3375, crop_y=height*0.07778\n\n# 6. 执行裁剪\nffmpeg -y -i 输入视频 -vf \"crop=计算后的参数\" -c:v libx264 -crf 18 -c:a copy 裁剪后视频\n\n# 7. 去头尾各10秒\nffmpeg -y -i 裁剪后视频 -ss 00:00:10 -c:v libx264 -crf 18 -c:a copy 去头视频\n# 获取时长后去尾\nffmpeg -y -i 去头视频 -t (时长-10) -c:v libx264 -crf 18 -c:a copy 最终视频\n\n# 8. 压缩到目标大小\n# 计算码率后执行压缩\nffmpeg -y -i 最终视频 -c:v libx264 -b:v 码率k -maxrate 码率*1.25k -bufsize 码率*2.5k -c:a aac -b:a 64k -ar 44100 输出视频\n```\n\n## 文件名约定\n\n**所有视频文件必须以BV号命名，禁止使用固定文件名如 `bilibili_video.mp4`。**\n\n- 下载时: `-o \"PATH/%(id)s.%(ext)s\"` → 生成 `BV1N14y1Y7uN.mp4`\n- 中间文件: `{bvid}_raw.mp4`, `{bvid}_cropped.mp4`, `{bvid}_trimmed.mp4`, `{bvid}_trim_start.mp4`\n- 最终输出: `{bvid}.mp4`\n\n这样每个视频都有独立文件名，不会相互覆盖。\n\n## 实际案例\n\n### 案例: 852x480视频处理\n\n**视频信息:**\n- BV号: BV1XP411H7ZC\n- 原始分辨率: 852x480\n- 原始时长: 177秒\n- 原始大小: 18.8MB\n\n**处理步骤:**\n1. bilix下载（yt-dlp返回412错误）\n2. 裁剪参数计算: `crop=527:400:287:37`\n3. 去头尾各10秒 → 时长157秒\n4. 压缩码率: vbr=404k, maxrate=505k, bufsize=1010k\n\n**最终结果:**\n- 输出尺寸: 526x400\n- 输出大小: 8.81MB\n- 成功压缩到10MB以内","tags":{"latest":"1.1.1"},"stats":{"comments":0,"downloads":594,"installsAllTime":1,"installsCurrent":1,"stars":0,"versions":3},"createdAt":1775701571695,"updatedAt":1781082423686},"latestVersion":{"version":"1.1.1","createdAt":1781082423686,"changelog":"**Summary: Improved B站视频下载兼容性，并适配多分辨率裁剪方案，清理冗余文件。**\n\n- 增加 bilix 作为 yt-dlp 反爬虫（HTTP 412）备用方案，提升下载成功率\n- 新增各分辨率裁剪参数自动计算公式，支持 720P、1080P、480P、360P 等分辨率精确裁剪\n- 细化 b23.tv 短链解析和手动处理流程说明\n- 删除冗余脚本和 skill-card.md 文件，减少复杂度\n- 保持下载文件名唯一性防止被覆盖，所有下载均以 BV号命名","license":"MIT-0"},"metadata":null,"owner":{"handle":"mimose101","userId":"s174rbezqj5857hkv5fxk58d9984h75y","displayName":"mimose101","image":"https://avatars.githubusercontent.com/u/119642201?v=4"},"moderation":null}