---
name: news-video-production
description: 新闻视频制作流程 - 真实素材下载，ffmpeg剪辑合成，edge-tts配音。新闻类必须用真实比赛/现场画面，科学类可用Mixkit素材。Coverr CDN已失效。
version: 2.0.0
---

# 新闻视频制作流程

## 需求
搜集全世界2小时内的新闻，剪辑成视频。**必须下载真实视频素材，不能只用纯色背景+文字**。

### 素材来源

#### ✅ Coverr（直接curl下载，2026-06-14确认）
- URL格式：`https://cdn.coverr.co/videos/{名称}/{ID}/360p.mp4`
- 搜索+下载：`curl -sL "https://coverr.co/s?q=关键词" | grep -oP 'https?://cdn.coverr.co/videos/[^"]*\.mp4'`
- 关键词：news, city, nature, technology, people, business, funny
- 文件大小：500KB~2MB（360p），无需登录
- 下载后验证文件大小（0字节=URL不对）
- 详见 `references/video-download-sources-2026-06-14.md`

#### ✅ Mixkit搞笑/fail视频（2026-06-15确认）
- **funny分类**：`https://mixkit.co/free-stock-video/funny/` — 枚举ID：3346/3351/3373/3469/4103/44877/4606/4608/4627/4640/4647/4688/4872/4886/49058
- **fail分类**：`https://mixkit.co/free-stock-video/fail/` — 枚举ID：11635/13133/13136/20866/23062/23244/23634/23714/23732/23926/23953/24053/24191/24255/24326/24352/24375/49219/49254/5486
- **hilarious分类**：`https://mixkit.co/free-stock-video/hilarious/` — 枚举ID：44875/44929/44931/45659/45959/45961/47027-47037
- **comedy分类**：`https://mixkit.co/free-stock-video/comedy/` — 枚举ID：12860/24440
- 直链格式：`https://assets.mixkit.co/videos/{ID}/{ID}-360.mp4`
- 下载必须加`-L`参数（跟随重定向），否则返回0字节
- 视频都是640x360横屏，需要ffmpeg转9:16竖屏
- **注意**：这些是stock footage（摆拍/素材），不是张哥要的"真人博主搞笑视频"。张哥要的是像抖音/快手那种真人拍的搞笑视频，目前免费网站几乎没有这类内容。

#### ❌ Dailymotion（2026-06-15确认搜索功能完全不可用）
- 搜索任何关键词（funny/fail/prank/slapstick/try not to laugh/people falling等）都返回同一批约20个熊猫纪录片视频
- 这不是关键词问题，是Dailymotion搜索机制对服务器IP的限制
- yt-dlp可以直接下载已知ID的视频，但搜索功能完全废了
- **不要浪费时间去Dailymotion搜搞笑视频**，结果全是熊猫
- 已验证的熊猫视频ID（不要下载）：x9aiij2/x9a5in6/x4glnb1/x7eufu4/x8ydzcq/x2lvolw/x3tajer/x98pne4/x9r8wam/x9ntc96/x6g4v1f/x6rcta6/x9u974q/x3rqmzr/x3pk3wc/x9xs52w/x3su9n9/x105tsl/xaehvfy/xyy6o3

#### ✅ Mixkit搞笑/fail视频（2026-06-15确认）
- Pexels/Pixabay：JS渲染SPA，curl+grep提取不到视频URL
- CNN直接下载：服务器端返回空
- Bilibili：弹验证码
- 抖音：超时
- Dailymotion：需firefox impersonation（本服务器无）
- **TikTok印度**：`yt-dlp -f "best[height<=720]" -o "output.mp4" "https://www.tiktok.com/@tiktokindia"`（无需登录）
- **ShareChat/Moj/Chingari/MX Player**（印度平台）：可访问但需进一步验证下载方式

## Match Highlights 制作流程（2026-06-13 更新）

### ⚠️ 关键原则（2026-06-13 用户反馈）
- **千万不能用 Mixkit/Coverr 等通用素材做比赛新闻！** 用户一眼认出"不是现场画面"并暴怒
- **必须用真实比赛视频**，且**必须去掉来源水印**（裁剪）
- **必须替换原声**为中文TTS解说，原声保留10%做背景音
- **不要问"行不行""要不要确认"**——直接做，做完发链接
- **先写文案**给张哥看（不等他批准直接继续做）
- **审批已关闭**：`hermes config set approvals.mode off`（不再每次操作问用户）
- **发结果时只发链接**，不发过程描述（每行字都花钱）

### 用户要求的新闻视频结构
用户明确要求按进球顺序剪辑：
1. **开场标题（5s）** — 赛事名称+比分+字幕
2. **比赛开始镜头（5-8s）** — 开球/入场
3. **每个进球片段（10-15s）** — 进球瞬间+球员庆祝+球迷欢呼（插1-2个镜头即可）
4. **对方进球片段（如有）** — 同样的格式
5. **结束比分（5-8s）** — 最终比分+总结

总时长：约1-1.5分钟。每个进球之间插入庆祝画面过渡。

### 适用场景
制作体育比赛新闻视频（世界杯、联赛等）。用户要求：必须用真实比赛画面，不能用通用素材库。

### 用户要求的视频结构（goal-by-goal格式）
用户明确要求按进球顺序剪辑，格式如下：
1. 开头→比赛镜头+中文标题字幕
2. 第1个进球片段→庆祝画面
3. 第2个进球片段→庆祝画面
4. 第3个进球片段→庆祝画面
5. 第4个进球片段→庆祝画面
6. 对方进球片段（如有）
7. 总结/比赛结果
总时长：约1分钟+。每个进球之间插入球迷/球员庆祝画面。

必须包含：**中文文字字幕（时间+比分+进球球员）** + **中文TTS解说配音**。

### 真实比赛视频获取（已验证路径）

| 来源 | 可用性 | 方法 |
|------|--------|------|
| **腾讯视频 v.qq.com** | ✅ 新发现！最佳来源 | `yt-dlp "https://v.qq.com/x/cover/.../....html"` 直接下载，无需登录。有腾讯水印需裁剪 |
| **NBC News** | ✅ 已验证 | curl下载HTML中提取的mp4链接（prodamdnewsencoding.akamaized.net） |
| **USA Today** | ✅ 已验证 | curl下载HTML中提取的mp4/m3u8链接（gannett-cdn.com） |
| **Getty Images** | ⚠️ 2026-06-17起直接curl下载被封锁 | 原可通过搜索页面获取`media.gettyimages.com/id/...`照片链接并用curl下载，但2026-06-17起所有链接返回0字节（即使添加User-Agent/Referer头也无法绕过）。最后一招：从Getty页面HTML中提取`<meta property="og:image">`的URL，可能仍有部分可访问。总体而言，Getty已不可靠，**不再推荐作为主要来源**。体育比赛新闻应优先找v.qq.com或Dailymotion视频。 |
| **Yahoo Japan搜索** | ✅ 最快 | 搜到新闻网站链接→再提取视频，或搜到v.qq.com链接→yt-dlp下载 |
| **央视网 CCTV (worldcup.cctv.com)** | ⚠️ 可找到视频元数据 | API返回视频信息+URL，但CDN防盗链（Wangsu WSSEA）阻止直接下载。元数据可用于发现比赛视频GUID |
| **YouTube** | ❌ 需cookies | yt-dlp报"Sign in to confirm" |
| **FOX Sports** | ❌ API 404 | yt-dlp FoxSports extractor返回404 |
| **Dailymotion** | ✅ yt-dlp直接下载（2026-06-15更新） | 从搜索页提取`/video/ID`→`yt-dlp "https://www.dailymotion.com/video/ID"`。无需impersonation。视频多为848x480或480x360。搜索页翻页结果相同（约20个固定ID）|
| **Pexels/Pixabay** | ❌ JS渲染SPA | curl+grep提取不到视频URL，不要用 |
| **Bilibili** | ❌ CAPTCHA | 搜索页面弹验证码 |
| **Douyin/抖音** | ❌ 超时 | 服务器网络限制 |
| **Invidious/Piped** | ❌ 已关停 | 大部分实例已shutdown |
| **BBC/RTE** | ❌ 超时/403 | Cloudflare或Geo-block |
| **Migu/咪咕** | ❌ 需登录 | 官方直播平台需要账号 |
| **雨燕直播 (yuyanzb4.net类)** | ❌ Cloudflare封锁 | 雨燕直播系/YYZB系使用Cloudflare CDN(gtr-cloudflare.net)封锁海外IP。相关域名: yuyanzb4.net, yuyantv.cn, yyzb1.tv, yuyanzb5.net, zh-front-yuyantv.com等。见 `references/chinese-live-streaming-platforms.md` |

### 工作流步骤

#### Step 1: 获取比赛信息
- Yahoo Japan搜索比赛结果（比分、进球时间、进球球员）
- 关键球员姓名、教练、比赛地点、观众人数

#### Step 2: 找真实视频（2026-06-13更新）
- **首选方法**：Yahoo搜索 → 找到腾讯视频(v.qq.com)链接 → yt-dlp下载
  ```
  # Yahoo搜索
  curl -sL "https://search.yahoo.co.jp/search?p=美国VS巴拉圭+世界杯2026+集锦+视频&ei=UTF-8"
  # 找到v.qq.com链接后：
  yt-dlp "https://v.qq.com/x/cover/xxxxx/xxxxx.html" -o /tmp/match_raw.mp4
  ```
- 备选：Yahoo搜索 `"球队A vs 球队B" "World Cup 2026" highlights site:nbcnews.com`
- 或者搜索 `"球队A vs 球队B" Getty Images`
- 进入新闻文章HTML，用正则提取mp4/m3u8链接
- 用curl直接下载
- 下载照片：`curl -sL -o photo.jpg` 后接URL
  ⚠️ **2026-06-17起Getty Images CDN直接下载被封锁**（全部返回0字节），体育比赛新闻应优先找v.qq.com。详见 sports-news-video-production skill

#### Step 3: 写解说词
- 用Yahoo Japan搜索到的比赛详情写中文解说
- 每个进球一段，按时间顺序
- 开头：欢迎语+比赛概述
- 中间：每个进球的时间/比分/进球球员/助攻球员
- 结尾：最终比分+比赛意义总结

#### Step 4: 生成视频
- 视频+音频合成：`ffmpeg -i video.mp4 -i audio.mp3 -shortest -pix_fmt yuv420p -c:v libx264 -c:a aac output.mp4`
- 照片转视频：`ffmpeg -loop 1 -i photo.jpg -i audio.mp3 -shortest -pix_fmt yuv420p -vf "scale=1280:720" output.mp4`
- **不要用pad滤镜**（会导致ffmpeg崩溃输出0字节文件）
- 用简单 `scale=1280:720` 即可
- 用concat协议拼接多个片段：`-f concat -safe 0 -i filelist.txt`
- 如果片段已经是1280x720，不需要scale

#### Step 5: 文本字幕（重要）
用户要求必须有中文文字和解说。可以用两种方式：
- **硬字幕（推荐）**：`ffmpeg -i input.mp4 -vf "drawtext=text='美国 2-0':fontfile=/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc:fontsize=48:fontcolor=white:x=(w-text_w)/2:y=h-100" ...`
  - ⚠️ drawtext在沙箱中有时报错，如果报错就用TTS配音替代画面字幕
- **TTS配音**（必须）：`python3 -m edge_tts --voice zh-CN-XiaoxiaoNeural --rate "+10%" --text "解说词" --write-media tts.mp3`

#### Step 6: 发布
- 复制到 `/tmp/tech_video.mp4`
- 通过 `http://157.173.212.215:8080/tech_video.mp4` 访问
- 如果用户说"没变"，提供新文件名避免缓存

### 腾讯视频下载 + 裁剪 + 进球片段拼接流程（2026-06-13已验证）

```bash
# 1. 下载腾讯视频比赛集锦
yt-dlp "https://v.qq.com/x/cover/XXXX/YYYY.html" -o /tmp/match_raw.mp4

# 2. 场景检测找切换点（进球通常会触发0.3+的场景变化）
ffmpeg -i /tmp/match_raw.mp4 -filter:v "select='gt(scene,0.3)',metadata=print:file=-" -f null NUL 2>&1 | grep "pts_time"

# 3. 裁剪水印+截取每个进球片段
# 腾讯水印在右上角，crop=1260:650:10:38 裁掉顶部38px和右边20px
for i in 0 1 2 3 4 5 6; do
  case $i in
    0) ss=0; t=8 ;;     # 开场
    1) ss=18; t=15 ;;   # 第1球
    2) ss=38; t=12 ;;   # 第2球
    3) ss=54; t=14 ;;   # 对方进球
    4) ss=72; t=14 ;;   # 第3球
    5) ss=90; t=15 ;;   # 第4球
    6) ss=207; t=8 ;;   # 结束比分
  esac
  ffmpeg -y -ss $ss -i /tmp/match_raw.mp4 -t $t \
    -vf "crop=1260:650:10:38" \
    -c:v libx264 -preset fast -crf 22 \
    -c:a aac -b:a 96k /tmp/news_clips/seg_${i}.mp4
done

# 4. 合并片段
ffmpeg -y -f concat -safe 0 -i <(for i in 0 1 2 3 4 5 6; do echo "file '/tmp/news_clips/seg_${i}.mp4'"; done) -c copy /tmp/combined.mp4

# 5. 生成TTS中文解说
edge-tts --voice zh-CN-YunxiNeural --rate=+5% \
  --text "各位观众朋友们大家好。今天在洛杉矶进行的比赛中...最终美国队4比1大胜巴拉圭。" \
  --write-media /tmp/commentary.mp3

# 6. 混合音频（解说+原声10%背景音）
ffmpeg -y -i /tmp/combined.mp4 -i /tmp/commentary.mp3 \
  -filter_complex "[0:a]volume=0.1[a1];[1:a]adelay=1000|1000[a2];[a1][a2]amix=inputs=2:duration=first:dropout_transition=2[a]" \
  -map 0:v -map "[a]" -c:v copy -c:a aac /tmp/usa_news_final.mp4

# 7. 添加比分字幕（可选，需要重编码）
ffmpeg -y -i /tmp/usa_news_final.mp4 \
  -vf "drawtext=text='1-0':fontcolor=#00FF00:fontsize=48:box=1:boxcolor=black@0.7:boxborderw=12:x=(w-text_w)/2:y=(h/2)-50:enable='between(t,8,22)'" \
  -c:v libx264 -preset fast -crf 23 -c:a copy /tmp/tech_video.mp4

# 8. 如果字幕重编码太慢，直接发布无字幕版
cp /tmp/usa_news_final.mp4 /tmp/tech_video.mp4
```

### 腾讯视频水印裁剪参数
- 视频分辨率：1280x716
- 水印位置：右上角（约38px高）
- 裁剪参数：`crop=1260:650:10:38`
- 即：裁掉左边10px、顶部38px、右边10px、底部28px
- 输出分辨率：1260x650

### Scene Detection阈值参考
- `gt(scene,0.3)`：大场景切换（进球、庆祝）推荐值
- `gt(scene,0.2)`：包含中等切换（传球、跑动）更敏感
- `gt(scene,0.5)`：只有非常明显的切换（广告、回放）
- 进球通常触发0.3-0.6的场景变化值

### TTS配音选声（体育新闻）
- `zh-CN-YunxiNeural`：男声，适合体育解说（推荐）
- `zh-CN-YunyangNeural`：男声，沉稳新闻风格
- `zh-CN-XiaoxiaoNeural`：女声，温柔风格
- 语速加成：`--rate=+5%` 或 `--rate=+8%` 或 `--rate=+10%`

### 常见问题
- **腾讯视频下载速度慢**：正常，服务器到腾讯CDN速度约500KB/s~1MB/s
- **concat时DTS警告**："Non-monotonic DTS"警告通常不影响播放
- **用户说"没变"**：浏览器缓存问题，用新文件名或加?版本号
- **审批弹窗**：已执行 `hermes config set approvals.mode off`
- **drawtext重编码慢**：86秒视频重编码约60秒，可以用-c:v copy跳过

### 图片→视频注意事项
- 照片转视频时：ffmpeg参数顺序重要（先-loop再-i）
- 照片和TTS时长要对齐：多张照片平均分配TTS时长
- 照片过渡：可以用 `-framerate 1/5` 让每张照片显示5秒

### 9:16竖屏视频转换（2026-06-15新增）
免费素材网站很少提供真正的9:16竖屏视频。用ffmpeg把低分辨率竖屏/横屏视频转成1080x1920：
```bash
# 竖屏视频→9:16（两边加黑边）
ffmpeg -i input.mp4 -t 30 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
  -c:v libx264 -preset ultrafast -crf 30 -c:a aac -b:a 96k \
  output.mp4
```
详见 `references/916-vertical-video-conversion.md`（在sports-news-video-production skill中）

### 1. 获取新闻
```bash
curl "https://top.baidu.com/api/board?platform=wise&tab=realtime"
```

### 2. 按新闻内容下载匹配素材
- 地震 → earthquake 分类
- 军事 → military 分类
- 火车 → train 分类
- 政治 → meeting/city 分类
- 一般 → news-studio 分类

### 3. 剪辑合成（终端直接操作，不用 Python PIL）
```bash
# 裁剪统一分辨率
ffmpeg -y -ss START -t 8 -i input.mp4 \
  -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,fps=25" \
  -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 128k -pix_fmt yuv420p seg_XX.mp4

# 合并
ffmpeg -y -f concat -safe 0 -i concat.txt -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 128k -pix_fmt yuv420p merged.mp4
```

### 4. 配音
```bash
python3 -m edge_tts --voice zh-CN-XiaoxiaoNeural --rate "+5%" --text "新闻稿" --write-media narration.mp3
```

### 5. 最终合成
```bash
ffmpeg -y -i merged.mp4 -i narration.mp3 -c:v copy -c:a aac -shortest final.mp4
```

## 中文字体
```bash
apt-get install -y fonts-wqy-zenhei fonts-noto-cjk
```
路径：`/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc`

## 关键教训
1. 素材必须和新闻内容匹配
2. 只发结果，不发过程
3. 每条新闻 8-10 秒素材，总时长 60-90 秒
4. 不要用 PIL 逐帧生成视频，太慢会超时
5. ffmpeg drawtext 加字幕在沙箱中可能报错，用终端直接操作更可靠
6. **HTTP服务器根目录是 `/tmp`**，视频文件必须放这里才能通过HTTP访问
7. **不要用YouTube/Google**，用户反感。用Yahoo Japan搜索
8. **服务器在印度**，可以直接访问外网，不需要VPN
9. 已有素材（mixkit + clip + tts）可以复用，不要重新生成
10. **HTTP服务器后台启动必须用 `background=True`**，不能用 `&` 后台符
11. **视频制作脚本可以复用**：`/root/videos/make_video.py` 跳过已存在文件重新运行即可
12. **ffmpeg滤镜字符串中的逗号会破坏Python subprocess参数传递**：当通过 `subprocess.run(cmd_list)` 调用ffmpeg时，`-vf "pad=1280:720:(ow-iw)/2:(oh-ih)/2"` 中的逗号会被Python解析为参数分隔符，导致ffmpeg收到错误参数。解决方案：用 `-c:v copy` 跳过重编码，或把滤镜写成单引号包裹的字符串
13. **成功的视频制作模式**：先单独生成TTS音频 → 再用 `ffmpeg -c:v copy` 把音频加到已有视频 → 最后用 `ffmpeg -f concat -c copy` 拼接。不要在Python脚本中一次性做裁剪+音频+拼接
14. **新闻类视频必须用真实比赛/现场画面**！Mixkit/Coverr素材只适用于科技/科普/自然类视频。做比赛新闻时从NBC News、USA Today等新闻网站下载真实报道视频，或从Getty Images下载真实比赛照片
15. **用户要求goal-by-goal结构**：每个进球一个片段+庆祝画面，加上中文文字字幕（时间+比分）+中文TTS解说
16. **比赛新闻视频的网络限制**：YouTube需要cookies（不可用），FOX Sports API 404，Dailymotion需impersonation，Bilibili弹验证码，中国平台超时。只有NBC News、USA Today、Getty Images可直接curl下载。Yahoo Japan用于搜索找到新闻链接
17. **Getty Images照片下载**：从搜索结果找到gettyimages.com链接→提取media.gettyimages.com/id/...的photo链接→curl下载→ffmpeg -loop 1 -i photo.jpg做幻灯片
18. **用户说"不考虑版权"**：放心下载使用，版权问题他自己负责
15. **edge-tts语音选择**：`zh-CN-XiaoxiaoNeural`（女声，之前成功）和 `zh-CN-YunxiNeural`（男声，本次成功）都可用。不要用带特殊字符的voice名称
16. **科技论文→通俗科普视频工作流**（2026-06-12新增）：
    - 用Yahoo Japan搜索最新科技论文/科技新闻
    - 选一个大众感兴趣的话题（如AI药物发现、AlphaFold、量子计算等）
    - 写通俗解说词（假设听众是普通人，不用专业术语）
    - 用Mixkit/Coverr的科技/城市/医疗相关素材做画面
    - 时长控制在40-90秒
    - 前面已有mixkit_computer_code、mixkit_tech、mixkit_newsroom等通用科技素材可用

## HTTP服务器

**体育比赛新闻视频制作请使用 `sports-news-video-production` skill（含ESPN API监控、进球解析、图文备选等专有工作流）。**

### 端口80（推荐，中国用户可能可达）

### 端口8080（SimpleHTTP）
```bash
# 启动（必须用background=True）
terminal(background=True, command="cd /tmp && python3 -m http.server 8080")

# 验证
curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/filename.mp4

# 外部访问
http://157.173.212.215:8080/filename.mp4
```

### ⚠️ HTTP服务器健康检查（重要）
HTTP服务器可能在网关重启或其他原因后停止工作。如果用户反馈链接打不开：
```bash
# 1. 检查是否在运行
pgrep -f "http.server" || echo "NOT RUNNING"

# 2. 检查端口
ss -tlnp | grep 8080

# 3. 如果没在运行，重启（必须用background=True）
terminal(background=True, command="cd /root && python3 -m http.server 8080")

# 4. 验证恢复
sleep 2 && curl -sI "http://127.0.0.1:8080/news_clips/coverr_news1.mp4" | head -3
```
- **不要用 `&` 后台符**启动HTTP服务器，必须用 `terminal(background=True)`
- 如果curl返回"Empty reply"，说明进程存在但有问题，先kill再重启
- **⚠️ 文件必须放在 `/root/` 目录下**（不是`/tmp/`！）。`/tmp`是2GB tmpfs，存视频会满。HTTP服务器工作目录设为`/root`，文件放`/root/news_clips/`。
- 如果端口被占用：`kill $(lsof -t -i :8080)` 然后重启

### 端口8888（Webchat）
```bash
# 启动
terminal(background=True, command="cd /root/.hermes/webchat && python3 server.py")

# 验证
curl -s -o /dev/null -w "%{http_code}" http://localhost:8888/
```

### 文件路径规则
- 端口8080：文件必须在 `/root/` 目录下（`/tmp`只有2GB，存视频会满）
- 端口8888：文件在 `/root/.hermes/webchat/static/` 目录下
- **视频素材目录**：`/root/news_clips/`（在`/root`下，HTTP服务器可访问）
- **不要用`/tmp`存大文件**：tmpfs 2GB会满，导致"No space left on device"
