# 横版视频保全画面转竖版留边交付

制作竖版审片文件，同时保全横版构图。本例选用 160×90 内容区，左右各留 10 像素，上下各留 115 像素。

完整包只使用 Node 标准库。FFmpeg 需使用自己已有的安装，本包不分发二进制；不在 PATH 时将 FFMPEG_BIN 设为其绝对路径。

在本目录运行，并选择不存在的新输出目录，脚本拒绝覆盖。受内存管理的工作站可在 Node 命令前加本地串行执行包装器。不需要提供商密钥，夹具不会向设备外发请求。

```sh
node run-recipe.mjs --out ./my-run
```

实际记录：8项检查通过，包含1项预期拒绝，Node v24.18.0。ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers

准备

- 准备 Node.js 与支持 libx264、scale、pad 的 FFmpeg，必要时设置 FFMPEG_BIN。记录环境为 Node v24.18.0 与 FFmpeg 6.0。
- 使用配套原创 landscape-source.mp4，时长一秒、十帧，左边为红色标记，右边为黄色标记；本素材刻意不含音轨。
- 明确各层尺寸：源片 320×180、缩放内容 160×90、输出 180×320，位置 x=10、y=115。本例使用 yuv444p 做小型无损比较。

## 01. 为完整构图设置可测标记

脚本在横版两侧制作可辨识色条。它们是验收目标：即使输出文件宽高已经竖版，任何一侧色条丢失仍代表源构图被裁掉。

## 02. 等比缩小，再增加画布

实际应用 scale=160:90:flags=neighbor,pad=180:320:10:115:color=black,setsar=1。内部 160×90 准确保持 16:9，外层为 9:16；保留少量侧边，避免把内容硬凑成 180 像素宽而出现比例舍入变形。

## 03. 解码并比较内部矩形

完整解码竖版输出为 RGB，将内部 160×90 与单独缩放的源帧逐通道比较，容许最大差值四。本次实际测得零。这个容差和小型 yuv444p 夹具不代表完整色彩管理验收。

## 04. 同时核对边框与帧数

验收十帧输出、上下黑边、左侧红标与右侧黄标。负向案例只是本地比例算式守卫：刻意不相等的交叉乘积触发拒绝，并没有另行编码拉伸坏文件或测试产品通用校验器。回执保留实际位置与最大 RGB 差值。

验收

- 输出文件实际完整解码出十帧 180×320 RGB。
- 外层准确为 9:16，内部 160×90 仍为 16:9。
- 内部画面相对独立缩放源帧的最大通道差不超过四，本次实测为零。
- 上、下留边抽样像素各通道不超过三，符合黑色。
- 交付画面内部仍能测到左红、右黄两条构图标记。
- 本地比例算式守卫拒绝不相等的交叉乘积；它不是对 FFmpeg 拉伸坏文件的检测，八项检查全部通过。

排错

主体铺满竖屏，但左右都被裁掉。只把布局改回配方中的 pad，重跑左右色条检查；裁切属于另一种交付选择。

画面似乎被轻微挤压。先把内部尺寸恢复为 160×90，再增加留边，用交叉相乘核对准确 16:9。

导出后像素比较产生差值。先比较 FFmpeg 版本与像素格式，重跑配套 yuv444p 夹具，再为另一种交付编码确定容差。

公开回执副本仅归一化本地 checkout 路径，publicPathNormalization 保存原始回执 SHA-256；未改动原件保留在非公开资产之外。真实回执位于 executed/。failure-receipt.json 记录预期负向案例，不表示套件断言失败。原创新夹具会重新生成到指定新目录，包内保留实跑输入输出便于复核。子进程使用参数数组、禁用 shell，设15秒超时与8MB输出上限。临时原始数据和本机 HTTP 服务在 finally 清理。

checksums.json 覆盖自身与 ZIP 以外的全部分发文件，避免循环自引用；ZIP 内包含同份清单。下载后可重算，但比较前提是预期清单可信。execution-receipt.json 记录实际脚本运行前后哈希，ZIP 也会由发布目录的资产清单绑定。

本回执只证明原创小型夹具的这次布局转换。正式上传前，仍应另行核对目标平台的编码与分辨率要求。

2026-10-14 实际读取的来源

- FFmpeg filters: scale, pad, trim, setpts and showinfo：https://ffmpeg.org/ffmpeg-filters.html
- FFmpeg command-line documentation: maps, codecs and error exit：https://ffmpeg.org/ffmpeg.html
- Node.js child process API: bounded argument-array execution：https://nodejs.org/api/child_process.html
