AoE Editor
使用此技能来处理长时间的《帝国时代》(Age of Empires, AoE) 游戏录制会话,将其切割成干净、独立的比赛片段,生成真实的 YouTube 缩略图,并管理 YouTube 定时上传。
严格的安全与防护护栏
1. 源录制文件的保留与完成标记
[!IMPORTANT] 永远不要删除源录制文件 —— 使用
- aoe-editor-done标记已完成的文件 在任何情况下,代理都不得删除、移除或覆盖原始的源录制文件(例如位于$env:USERPROFILE\Videos\中的文件)。
- 处理期间源文件保持不动:即使在成功提取、审核或上传到 YouTube 之后,原始会话录像也绝不能删除。
- 完成后重命名(
- aoe-editor-done):一旦源录制中的所有游戏都已编辑、切片、验证并保存到目标日期文件夹,必须通过对源文件进行重命名,在其扩展名之前追加- aoe-editor-done:
- 示例 (
.mp4):2026-10-27 20-35-29.mp4->2026-10-27 20-35-29 - aoe-editor-done.mp4- 示例 (任意扩展名):
<filename>.<ext>-><filename> - aoe-editor-done.<ext>- PowerShell 命令:
$item = Get-Item "<SourcePath>" Rename-Item -Path $item.FullName -NewName "$($item.BaseName) - aoe-editor-done$($item.Extension)"- 跳过已完成的文件:在扫描或识别要处理的录制会话时,始终忽略并跳过任何在其扩展名前已包含
- aoe-editor-done的文件。- 被丢弃的游戏:对于被跳过或丢弃的游戏(例如,时长 < 7 分钟),只需跳过该片段的提取。切勿剪切、截断或删除源视频的任何内容。
- 仅清理临时文件:只有临时暂存文件(例如临时/暂存文件夹中的样例帧 JPEG)可以被清理。永远不要删除源视频文件。
2. 严格的安全与凭证保护
[!CAUTION] 永远不要读取凭证或令牌文件 在任何情况下,代理都不得读取、查看、显示或检查任何凭证文件、密钥或令牌的内容。
- 零检查:特别地,绝对不要读取、检查、cat、打印或输出
$env:USERPROFILE\Videos\yt-uploader\中的任何文件(例如request.token、youtube.token.json、client_secrets.json或任何*.token/*.json凭证文件)。- 仅执行:在执行
yutu时,仅使用环境变量(YUTU_CREDENTIAL、YUTU_CACHE_TOKEN)和命令行标志来调用它。绝不要检查或输出它读取的令牌或密钥。
3. 无人值守处理期间的防睡眠机制(原生保持唤醒)
为使工作流能够完全无人值守运行(检测、剪辑片段、渲染缩略图或批量上传到 YouTube),同时允许用户的显示器按正常设置关闭或休眠,请使用以下方法:
- 默认方法(原生 Windows API - 屏幕可以休眠):使用 Windows
SetThreadExecutionState和ES_CONTINUOUS | ES_SYSTEM_REQUIRED(0x80000001)。这会告知 Windows 后台处理/上传正在活动,保证 CPU、磁盘和网络永不进入睡眠状态,同时允许监视器按照正常的 Windows 电源设置关闭或休眠:$sig = '[DllImport("kernel32.dll", SetLastError=true)] public static extern int SetThreadExecutionState(int esFlags);' $power = Add-Type -MemberDefinition $sig -Name 'PowerHelper' -Namespace 'SystemSleep' -PassThru # 阻止系统睡眠(允许显示器休眠) $power::SetThreadExecutionState([int]0x80000001) - 释放睡眠锁:一旦所有批量任务或上传完成,将执行状态重置回默认的连续模式:
$power::SetThreadExecutionState([int]0x80000000) - 替代方案 (Caffeine):Caffeine 已安装在
caffeine64.exe。由于 Caffeine 每 59 秒模拟一次键盘输入,它会阻止显示器睡眠,除非物理关闭显示器。建议使用上述原生方法作为标准。 - 推荐时长/用法:
- 在一次批量作业(特别是上传,6-8 GB 的视频可能需要 1-3 小时)期间保持活动状态,并在完成后立即释放。
目标文件夹结构
所有处理过的游戏和缩略图都保存在从录制文件名派生的、带有日期的 aoe 子文件夹中:
$env:USERPROFILE\Videos\aoe\<DDMmmYY>\
├── Game 1 - <MyCiv> vs <OpponentCiv> (<Map> - <Result>).mp4
├── Game 1 - <MyCiv> vs <OpponentCiv> (<Map> - <Result>).png # 缩略图,名称与视频完全匹配
├── Game 3 - <MyTeamCivs> vs <OpponentCivs> (<Map> - <Result>).mp4 # (例如,Game 2 因 <7m 被丢弃)
├── Game 3 - <MyTeamCivs> vs <OpponentCivs> (<Map> - <Result>).png
└── ...
日期文件夹规则
- 日期从视频文件名中解析:
YYYY-MM-DD ...- 示例:
2026-10-27 20-35-29.mp4->27Oct26 - 示例:
2026-10-29 19-46-42.mp4->29Oct26 - 格式:
<Day><3-letter Month><2-digit Year>(例如,13Oct26、27Oct26、29Oct26)。
- 示例:
游戏过滤与时长规则
-
7分钟以下的短游戏(自动丢弃/跳过导出):
- 任何游戏内时长低于7分钟(例如,早期投降、断线、启动失败)必须跳过导出(不提取或保存为输出片段)。不要删除、截断或修改原始源视频的任何部分。
- 保留按时间顺序编号:被丢弃的游戏仍然占用其在录制会话中的时间顺序编号。
- 示例:如果游戏1为18分钟,游戏2为2分钟(被丢弃),游戏3为25分钟,则生成的输出文件将是
Game 1 - ...后跟Game 3 - ...。游戏2在文件列表中被跳过,这样编号就能准确反映原始比赛顺序。
- 示例:如果游戏1为18分钟,游戏2为2分钟(被丢弃),游戏3为25分钟,则生成的输出文件将是
-
一边倒/沉闷的游戏(切割并供用户审核):
- 如果比赛看起来严重一边倒或沉闷(例如,早期分数大幅领先、抵抗/交战极少、毫无竞争性的碾压):
- 照常切割并保存游戏到日期文件夹,以便本地录像得以保留。
- 提示用户:将片段详情、时间戳以及为何感觉一边倒/沉闷告知用户。要求用户审查该片段,然后再决定是否将其加入 YouTube 上传队列。
- 如果比赛看起来严重一边倒或沉闷(例如,早期分数大幅领先、抵抗/交战极少、毫无竞争性的碾压):
游戏检测与修剪规则
-
片段起始点:
- 在加载屏幕过渡到游戏开始(城镇中心和起始单位出现)时立即开始。
-
片段结束点与赛后分析:
- 保留赛后分析:如果玩家查看了赛后成就画面(总结、军事、经济、科技、社会)或观看了回放分析,则将其保留在游戏视频片段中。
- 片段在玩家离开赛后画面/回放返回主菜单或队列时结束。
-
需要剪掉的内容:
- 匹配队列等待时间。
- 大厅等待和文明选择倒计时画面。
- 任何空闲时间、桌面浏览或离开键盘 (AFK) 的片段。
严格的命名约定
1. 本地视频和缩略图文件名 (.mp4 / .png)
本地磁盘上的文件用于本地跟踪、归档和比赛时间顺序记录:
- 游戏编号:会话中的时间顺序比赛索引(
Game 1、Game 2等),为 <7m 被丢弃的比赛保留跳过的编号。 - 文明:
- 1v1:
Game <N> - <MyCiv> vs <OpponentCiv> (<Map> - <Result/Notes>).mp4- 示例:
Game 1 - Ethiopians vs Franks (Arabia - Win).mp4
- 示例:
- 团队赛:
Game <N> - <MyTeamCivs> vs <OpponentCivs> (<Map> - <Result/Notes>).mp4- 示例:
Game 3 - Khmer and Franks vs Persians and Bohemians (Arena - Win).mp4
- 示例:
- 1v1:
- 缩略图文件名:必须与
.mp4文件名逐字符匹配,将.mp4替换为.png。
2. YouTube 视频标题(通过 -title / -metaJSON 上传到 YouTube)
[!IMPORTANT] YouTube 标题:无胜负剧透,无游戏编号 发布到 YouTube 的标题绝不能泄露比赛结果,并且绝不能包含会话游戏编号:
- 不要包含
Win或Loss:绝不为观众剧透比赛结果。- 不要包含
Game 1、Game 2等:YouTube 上的观看者浏览的是独立比赛,而不是原始的会话索引。- 标准 YouTube 标题语法:
<MyTeamCivs> vs <OpponentCivs> AOE2 <MatchFormat> <Map>
- 1v1 格式:
<MyCiv> vs <OpponentCiv> AOE2 1v1 <Map>
- 示例:
Khmer vs Bohemians AOE2 1v1 Arena- 示例:
Dravidians vs Tatars AOE2 1v1 Arabian Desert- 示例:
Ethiopians vs Franks AOE2 1v1 Arabian Desert- 2v2 格式:
<Civ1> & <Civ2> vs <Civ3> & <Civ4> AOE2 2v2 <Map>
- 示例:
Khmer & Franks vs Persians & Bohemians AOE2 2v2 Arena- 示例:
Khmer & Bengalis vs Malians & Mongols AOE2 2v2 Arena- 3v3 格式:
<Civ1>, <Civ2> & <Civ3> vs <Civ4>, <Civ5> & <Civ6> AOE2 3v3 <Map>
- 示例:
Khmer, Bohemians & Goths vs Ethiopians, Romans & Celts AOE2 3v3 Arena- 4v4 格式:
<Civ1>, <Civ2>, <Civ3> & <Civ4> vs <Civ5>, <Civ6>, <Civ7> & <Civ8> AOE2 4v4 <Map>
- 示例:
Ethiopians, Franks, Britons & Mayans vs Mongols, Tatars, Turks & Persians AOE2 4v4 Black Forest
真实缩略图与动态模因指南 (.png)
[!IMPORTANT] 缩略图文件名必须与视频文件名匹配 每个视频的缩略图文件名必须与视频文件名完全匹配(将扩展名替换为
.png):
- 视频:
Game 1 - Ethiopians vs Franks (Arabia - Win).mp4- 缩略图:
Game 1 - Ethiopians vs Franks (Arabia - Win).png- 视频:
Game 3 - Khmer and Franks vs Persians and Bohemians (Arena - Win).mp4- 缩略图:
Game 3 - Khmer and Franks vs Persians and Bohemians (Arena - Win).png
避免误导性的点击诱饵或重复单一模因。缩略图应基于实际发生的情况,保持模因编辑多样化、有机且适合比赛故事:
1. 高影响力缩略图风格与排版
设计大胆、高对比度的排版,针对移动信息流可读性进行优化:
- 大而有力的文字:字体大小必须足够大,在移动信息流中能立即看清(1440p 分辨率下
fontsize=140到160,其他分辨率按比例缩放)。切勿使用小字体或低对比度文字(<100)。 - 粗轮廓和投影:使用厚重的黑色边框(
borderw=8到12)和阴影(shadowx=4:shadowy=4:shadowcolor=black),使文字在任何背景下都能突出显示。 - 双色调与多色文字风格:不要默认使用简单的纯白色文字。在单词/行之间使用对比鲜明、鲜艳的颜色:
- 顶部单词用白色 (
#FFFFFF),底部/点睛单词用鲜艳的金色/黄色 (#FFD700或#FFE500) 或橙色 (#FF8C00)。 - 双色调布局示例:
"LETS STEAL"(白色) / "SOME GOLD!"(黄色)"OUTPOST"(白色) / "REVENGE!"(橙色)"CASTLE"(白色) / "MELTERS"(黄色)"WHY MAKE"(白色) / "THESE?!"(橙色)"SCORPION"(白色) / "DEATHBALL"(黄色)"CELT SIEGE"(黄色) / "UNSTOPPABLE"(白色)
- 顶部单词用白色 (
- 动态灵活的文字位置(严格主体避让):
-
[!IMPORTANT] 文字绝不能覆盖焦点单位或主体
- 文字叠加层绝不能覆盖、遮挡或位于钩子中命名的焦点单位、建筑或战术事件之上(例如,如果钩子说
"SIEGE ELEPHANT BREACH",攻城象必须保持 100% 可见且不被文字遮挡)。 - 将文字严格放置在不覆盖动作区域的位置(在开放的负空间、战争迷雾或空旷地形中)。
- 检查单位在哪里、战斗发生在屏幕何处,并动态将文字放置在顶部中央、顶部左侧、顶部右侧或底部中央,以便焦点动作和主体单位完全不被遮挡。
-
2. 动作帧选择与视觉文字证实
- 零闲置基础帧:绝不要选择画面拉回到和平的家乡农场、城镇中心或经济队列,而动作发生在别处的帧。
- 进行中的主动战斗与攻击(绝不是战后余波或空废墟):
- 帧必须捕捉实时的、进行中的战斗或攻击:单位在肉搏中积极交锋、射箭、发射攻城弹丸、掠夺经济区或攻击敌方基地/城堡。
- 没有空的静态废墟:绝不要选择破碎墙壁或受损建筑的帧,其中没有敌方单位在主动攻击或存在。没有活跃部队的破墙看起来被遗弃、静态且无趣。
- 没有战后余波(地面尸体):绝不要选择战斗结束后、只显示地上尸骸、其余单位闲立的帧。捕捉战斗期间的动作,而不是之后。
- 无结果泄露或分数剧透:
- 缩略图绝不能泄露比赛结果:
- 绝不要捕捉显示
"Player X resigned"在聊天中或计分框中玩家名字被划掉的帧。 - 没有分数差距 / 基地被碾压泄露:绝不要选择右下角计分框显示巨大分数差距(例如,玩家分数为对手的 70–75%)且玩家基地被摧毁/被掠夺的帧。这会明显向观众泄露失败信息,破坏悬念。保持分数和棋盘状态模糊或裁剪/干净。
- 绝不要捕捉显示
- 所有缩略图帧必须在活跃、紧张、竞技的游戏过程中捕捉。
- 缩略图绝不能泄露比赛结果:
- 面部摄像头表情质量与裁剪检查协议:
- 如果录制内容包含网络摄像头/面部摄像头叠加层:
- 专用面部摄像头检查(以 1:1 比例裁剪并验证):绝不要仅依赖全 1440p 视图来判断面部表情。代理必须在最终确定帧之前,单独裁剪并检查面部摄像头区域(
crop=390:300:0:890或等效网络摄像头框)的像素级比例。
- 专用面部摄像头检查(以 1:1 比例裁剪并验证):绝不要仅依赖全 1440p 视图来判断面部表情。代理必须在最终确定帧之前,单独裁剪并检查面部摄像头区域(
- 如果录制内容包含网络摄像头/面部摄像头叠加层:
……
[用于翻译的截断内容]