展开本页目录
开始前准备什么
- 已保存到本地的实际 MP4,保留对应 task_id 与请求参数。
- Python 3.10+、FFmpeg 和 ffprobe;脚本不读 Key、不请求 API、不上传文件。
- 预先确定的目标尺寸、时长容差、音频要求和内容审核标准。
- 保存实际文件
- 探测规格
- 检查解码与音轨
- 全片人工审核
- 记录最终结论
补充:原有练习资料与下载
不调用 API:检查实际尺寸、时长、音轨和完整解码,需要本机 FFmpeg 与 ffprobe。
预期与实收规格、完整播放、主体、文字和最终结论分开记录。
本地文件限制、退出码与人工审核边界。
真实验收:900帧MP4的格式、色彩与完整解码
ffprobe与FFmpeg完整解码实测,并修正首轮full-range色彩范围;参数必须以实际输出复验。
· 对今日生成30秒MP4完整探测、解码、抽帧;容器可读/解码无错不证明语义正确、音画同步、色彩准确或所有播放器兼容。本例无声是设计目标。
- 运行环境
- 8.0.1;macOS arm64,本地独立运行目录;无私人素材、无付费API调用
1. 先写验收目标:画幅1080×1920、30fps、900帧、30秒,无旁白所以应无音轨
先写验收目标:画幅1080×1920、30fps、900帧、30秒,无旁白所以应无音轨。
2. 运行ffprobe输出JSON,分别读取视频width/height/avg_frame
运行ffprobe输出JSON,分别读取视频width/height/avg_frame_rate/codec_name/pix_fmt/nb_frames,音频流需单独检查。
bashffprobe -v error -show_format -show_streams -of json output.mp43. 不要只看format.duration或文件后缀:逐项对照预期;r_frame_rate
不要只看format.duration或文件后缀:逐项对照预期;r_frame_rate和avg_frame_rate不同需要进一步检查可变帧率。
4. 运行ffmpeg -v error -i output.mp4 -f null -完整解
运行ffmpeg -v error -i output.mp4 -f null -完整解码,保存退出码和错误日志;本次退出0、错误日志0字节。
bashffmpeg -v error -i output.mp4 -f null -5. 抽取2/6/16/26秒画面对应四段分镜,检查标题安全边距和文本;有声视频另外回听头/中
抽取2/6/16/26秒画面对应四段分镜,检查标题安全边距和文本;有声视频另外回听头/中/尾音画同步。
6. 首轮若像本次一样出现yuvj420p/full-range,回到渲染设置加--color
首轮若像本次一样出现yuvj420p/full-range,回到渲染设置加--color-space=bt709再导出,重复probe和完整解码。
这次实际得到什么
- 视频流1条、音频流0条,和本次无旁白目标一致。
- avg_frame_rate与r_frame_rate均为30/1,900帧、30秒。
- 初次实际探测yuvj420p/pc,修正后实际yuv420p/bt709/tv。
- 最终完整解码成功,退出0、错误日志0字节;不等于所有播放器或语义均正确。
使用这份结果时注意
- 对今日生成30秒MP4完整探测、解码、抽帧;容器可读/解码无错不证明语义正确、音画同步、色彩准确或所有播放器兼容。本例无声是设计目标。
- 首轮未显式指定color-space,ffprobe显示yuvj420p和pc范围;加--color-space=bt709重新渲染后,实际探测为yuv420p、bt709、tv。保留首轮文件和探测,不能仅以CLI参数认定格式。
把请求参数和实际规格并排记录
实际宽高来自视频流,实际时长来自文件。720p 配合不同画幅可能得到不同宽高;先确定目标像素,而不是只用 720p 字样验收。请求秒数与封装时长允许多大误差,由交付要求决定。
下载的验收表把预期和实收分开,任务 ID 与文件 SHA-256 关联。文件名叫 .mp4 不能证明它是视频,HTML 错误页或损坏文件需要在技术检查阶段拒绝。
| 条件 | 怎么检查 | 通过后仍需确认 |
|---|---|---|
| 格式与解码 | MP4 容器及完整解码 | 目标播放器实际播放 |
| 宽高与时长 | 视频流宽高与文件时长 | 构图、裁切和交付容差 |
| 音轨 | 是否存在音轨、实际听音 | 声音内容和同步 |
| 主体与文字 | 原图对照与全片审核 | 商品事实、字形与动作连续 |
- 条件
- 格式与解码
- 怎么检查
- MP4 容器及完整解码
- 通过后仍需确认
- 目标播放器实际播放
- 条件
- 宽高与时长
- 怎么检查
- 视频流宽高与文件时长
- 通过后仍需确认
- 构图、裁切和交付容差
- 条件
- 音轨
- 怎么检查
- 是否存在音轨、实际听音
- 通过后仍需确认
- 声音内容和同步
- 条件
- 主体与文字
- 怎么检查
- 原图对照与全片审核
- 通过后仍需确认
- 商品事实、字形与动作连续
本地检查尺寸、时长和完整解码
脚本只处理明确指定的本地 MP4,上限 300 MiB。ffprobe 读取规格,ffmpeg 解码完整视频和音频;每次媒体工具运行限时 120 秒,超时保留未确认状态。
--size 设置精确宽高,--duration 设置预期秒数,默认误差容许 0.25 秒,可以按交付要求修改。退出码 0 是本次技术条件通过,1 是未通过,2 是检查未确认;人工审核状态始终是 pending。
bash
python3 video-quality-check.py output.mp4 --size 720x720 --duration 4
python3 video-quality-check.py output.mp4 --size 720x720 --duration 4 --duration-tolerance 0.1
ffprobe -v error -show_entries stream=codec_type,codec_name,width,height:format=duration,size -of json output.mp4无声要求要检查文件,不看播放器静音图标
--expect-no-audio 要求实际文件没有音轨,静音音轨也不能通过这项条件。如果你的交付要求是有音轨但没有可闻声音,另外做音频解码、音量检测和试听,两种要求分别记录。
历史 Seedance 样本请求 generate_audio=false,返回文件仍含非静音 AAC;检测平均 -27.6 dB、峰值 -11.8 dB。此样本的无声要求未通过,页面默认静音只影响播放状态。当前通道行为需要用自己的实际结果核对。
bash
python3 video-quality-check.py output.mp4 --size 720x720 --duration 4 --expect-no-audio
ffprobe -v error -select_streams a -show_entries stream=codec_name,channels -of json output.mp4
ffmpeg -hide_banner -i output.mp4 -map 0:a:0 -af volumedetect -f null -完整播放,再对照主体与文字
完整播放检查动作连续、转场、遮挡、闪烁和声音同步;再抽查开头、中段、结尾的细节。抽帧只能帮助定位,不能证明没抽到的画面合格。
商品与人物参考需要逐项检查外观、数量、颜色和关键结构;文字逐字核对。可解码、分辨率足够或画面漂亮,都不能代替这些审核。技术通过但内容不符时,将人工验收记为 fail。
保存不合格项与费用,便于返工
将任务终态、下载成功、技术检查、人工验收和实扣分别记录。修改需求后新建输入版本,保留原成片与失败原因,避免只保留最后合格版本。
此检查工具不会请求生成,也不会确定费用。它验证本地文件;当前任务的账单从自己的控制台核对,未知金额填 unknown,后期剪辑或移除音轨的处理也另记。
怎样确认已经完成
- MP4 与原任务 ID、请求参数和 SHA-256 对应。
- 实际宽高、时长、音轨与完整解码按明确条件检查。
- 目标播放器完整播放,主体、文字、动作和声音人工审核。
- 技术通过和人工通过分别记录,费用未知未填 0。
常见问题
ffprobe 检查成功,就一定能正常播放吗?
不能保证目标播放器兼容。ffprobe 提供规格,脚本还会完整解码;正式交付仍要在目标播放器播放全片。
有音轨但听不到声音,算无声视频吗?
取决于要求。无音轨要求会判未通过;允许静音音轨时需另做解码音量检测和试听,不能只看播放器默认静音。
脚本通过就可以自动发布吗?
不能。脚本输出的 manual_review_status 始终为 pending,商品一致性、文字、动作、声音内容与渠道规范需要人工确认。

