Skip to the content.

截图与音轨提取的验收边界

调用和格式见 Media README。两个入口复用视频探测、进程管理和暂存发布;普通音频编辑仍由 Audio 组件承担。

截图

时间须落在已知容器时长的 [0, duration),但容器可能比视频轨更长,所以检查通过仍可能无帧。FFmpeg 精确寻址选不早于请求时刻的第一帧;末尾没有后续帧时返回读取错误,不根据平均帧率猜测或向前夹取。

先校验方向校正后的画面与图片预算,再让 FFmpeg 写无损 PNG,交 ImageProcessor 裁剪、缩放和编码到目标格式。这样 JPEG 只发生最后一次有损编码。显式图片选项的格式必须与目标扩展名相同。

中间 PNG 解码也受压缩字节预算约束,高噪声大图可能在像素预算内却超过该限额。检查并不硬限制 FFmpeg 的全部 native 内存或磁盘写量;错误时只删除本次暂存文件。

音轨

AudioTrackIndex 是音频集合中的零基索引,不是容器绝对 stream index。先探测所选轨的采样率、声道和可用时长,编码命令显式指定该采样率/声道,输出再探测核对,避免隐式重采样或混音。

WAV 输出 PCM16,MP3/M4A 请求 192 kbps,FLAC 用无损编码;MP3 只支持单/双声道。保持采样率不等于所有编码器都接受该采样率,缺失编码器或不支持参数会按进程失败处理。

时间起点与结束检查优先所选音轨时长,未知时回退容器时长;超过余下部分的 Duration 自然截到尾部。输出使用 ffprobe 解码计数,必须存在可解码帧才发布,这会额外读取输出。返回实际编码、采样率、声道和可得到的时长,不能把有损编码时长当作逐样本精度证明。

无音轨、轨道不存在和纯音频输入均失败;该入口先要求视频轨,不能用它代替一般音频转换。

生命周期与回归

两个路径都先生成独占暂存文件,完整处理和验收后才不覆盖地发布。父目录可按需创建,失败不递归删除它;进程、取消、超时、诊断和聚合清理异常遵循共享视频生命周期。

VideoAssetsTests 检查实际截图像素、所选音轨、编码/采样率/声道、空帧和时间边界、错误格式、取消及目标保护。真实测试需 RUN_MEDIA_FFMPEG_TESTS=true,并提供 PNG/JPEG/WebP、PCM、MP3、AAC、FLAC 及 fixture 用 FFV1 编解码支持。