# ffmpeg视频制作教训（2026-06-12）

## 问题：clip文件全部0字节

**现象：** 
- 用Python脚本调用ffmpeg裁剪+合并视频
- TTS生成成功，但ffmpeg裁剪后的clip_new_*.mp4全部是0字节
- concat合并也失败（merged_new.mp4不存在）

**错误信息：**
```
[vost#0:0/libx264] Terminating thread with return code -22 (Invalid argument)
[out#0/mp4] Nothing was written into output file, because at least one of its streams received no packets.
```

**根本原因：**
- Python subprocess调用ffmpeg时，复杂滤镜链可能导致stream mapping失败
- `-i src.mp4 -i tts.mp3`双输入+ `-map 0:v:0 -map 1:a:0`在某些情况下不兼容
- scale+pad滤镜链过于复杂

## 解决方案

### 方法1：Python subprocess中避免滤镜字符串逗号问题（推荐）
```python
# ❌ 错误写法 - 滤镜字符串中的逗号会破坏参数传递
cmd = ["ffmpeg", "-y", "-i", src, "-i", tts,
       "-vf", "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2",
       ...]  # subprocess会把滤镜字符串按逗号拆开！

# ✅ 正确写法 - 用 -c:v copy 避免重编码，不需要滤镜
cmd = ["ffmpeg", "-y", "-i", src_clip, "-i", tts,
       "-c:v", "copy",
       "-c:a", "aac", "-b:a", "128k",
       "-shortest", output]

# ✅ 如果必须用滤镜，用 shlex  Shell=True
import shlex
cmd = f"ffmpeg -y -i src.mp4 -i tts.mp3 -vf 'scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2' -shortest out.mp4"
subprocess.run(cmd, shell=True)
```

### 方法2：分步处理（最可靠）
```bash
# 先裁剪视频（不要裁剪音频）
ffmpeg -y -t 8 -i mixkit_tech.mp4 -c:v copy seg.mp4

# 再合并音频
ffmpeg -y -i seg.mp4 -i tts.mp3 -c:v copy -c:a aac -shortest clip.mp4
```

### 方法3：在终端直接执行
不要在Python脚本中调用ffmpeg，直接在终端逐条执行。

### 方法4：不用concat，用-filter_complex直接拼接
```bash
ffmpeg -y -i clip_00.mp4 -i clip_01.mp4 -i clip_02.mp4 \
  -filter_complex "[0:v][1:v][2:v]concat=n=3:v=1:a=0[outv];[0:a][1:a][2:a]concat=n=3:v=0:a=1[outa]" \
  -map "[outv]" -map "[outa]" -c:v libx264 -preset fast merged.mp4
```

## 已验证可用的方法

```bash
# Coverr视频直接curl下载 ✅
curl -sL "https://cdn.coverr.co/videos/coverr-local-dutch-newspapers-8257/360p.mp4" -o news_stand.mp4

# TTS生成 ✅
python3 -m edge_tts --voice zh-CN-XiaoxiaoNeural --rate "+5%" --text "内容" --write-media tts.mp3

# 单独裁剪视频（不含音频）✅
ffmpeg -y -t 8 -i input.mp4 -vf "scale=1280:720" -c:v libx264 -preset fast -an seg.mp4

# 给已有clip加音频（不重编码）✅
ffmpeg -y -i clip_00.mp4 -i tts_00.mp3 -c:v copy -c:a aac -b:a 128k -shortest audio_00.mp4

# 拼接（不重编码）✅
ffmpeg -y -f concat -safe 0 -i concat.txt -c copy -movflags +faststart merged.mp4
```

## 2026-06-12 新发现

### HTTP服务器（端口8080）
- HTTP服务器根目录是 `/tmp`（不是 `/root`）
- 视频文件必须放在 `/tmp` 才能通过HTTP访问
- 服务器可能挂了，需要用 `background=true` 重启
- 访问地址：`http://157.173.212.215:8080/filename.mp4`
- ⚠️ 不要用 `&` 后台符启动，Hermes会报错。必须用 `background=true`

### 视频制作成功路径（2026-06-12验证）
- `/root/videos/` 下的 mixkit素材 + clip_00~08 + tts_00~08 仍然存在（6月6日生成）
- 脚本 `make_video.py` 的逻辑：**跳过已存在的文件 + concat合并 + 烧录字幕** 是有效的
- 最终视频：`final_video.mp4`（9.5MB，96秒，1280x720，有字幕有配音）
- 复制到 `/tmp/news-broadcast.mp4` 可通过HTTP访问

### 用户偏好（重要）
- ❌ 不要用YouTube（需要登录，且用户反感）
- ❌ 不要用Google搜索
- ✅ 用Yahoo Japan搜索：`https://search.yahoo.co.jp/search?p=关键词`
- 服务器（印度）可以直接访问外网，不需要VPN

### 素材文件清单（已有）
- `/root/videos/mixkit_*.mp4` — 9个mixkit素材
- `/root/videos/clip_00.mp4 ~ clip_08.mp4` — 9个已裁剪片段
- `/root/videos/tts_00.mp3 ~ tts_08.mp3` — 9个TTS配音
- `/root/videos/make_video.py` — 原始制作脚本
- `/root/.hermes/webchat/static/news-broadcast.mp4` — 上一个最终版
- `/root/videos/news/` — Coverr下载的新闻视频素材（8个新素材 + 2个旧的）

### 真实素材（用户要求）
用户明确要求"真实视频"，不要动画/插画风格。已确认可用的真实素材：
- `mixkit_aerial_city.mp4` — 航拍城市（7秒）✅ 真实
- `mixkit_people_walking.mp4` — 行人（12秒）✅ 真实
- `mixkit_nature_forest.mp4` — 森林（11秒）✅ 真实
- `mixkit_sunset_beach.mp4` — 海边日落（12秒）✅ 真实
- `mixkit_city_traffic.mp4` — 城市交通（11秒）✅ 真实
- `mixkit_newsroom.mp4` — 新闻编辑室（17秒）✅ 真实
- `mixkit_office_work.mp4` — 办公室（11秒）✅ 真实
- `coverr_news_feed.mp4` — 看手机新闻（20秒）✅ 真实
- `coverr_newsstand.mp4` — 报摊（29秒）✅ 真实

### 世界杯集锦视频（2026-06-12新增）

制作了一场墨西哥2-0南非的集锦视频（39秒，12MB）：
1. 从一个Yahoo搜索片段确定了比分为2-0（三张红牌）
2. 下载了6个Mixkit足球相关素材（stadium, football_player, soccer_kick, crowd_cheer, stadium_aerial, celebration）
3. 编辑了6段解说词（开幕→到→完美开局）
4. edge-tts生成中文配音（zh-CN-YunxiNeural，+5%速率）
5. ffmpeg加音频（-c:v copy）+ 拼接（-c copy）
6. 复制到/tmp提供HTTP访问
7. 观看：`http://157.173.212.215:8080/wc_highlights.mp4`

关键：足球素材从Mixkit sports分类下载，解说词按比赛流程编排（开场→比赛过程→进球→庆祝→总结）
- 前两个片段换成真实视频：航拍城市 + 行人匆匆
- 最后一个换成森林深处
- 时长58秒，11MB，有中文配音
- 观看：http://157.173.212.215:8080/news-broadcast.mp4
