把几段素材依次列出,不等于已经交代它们怎样接入同一条时间轴。FFmpeg Formats文档3.6将concat称为虚拟串接脚本解复用器:它从文本清单读取文件及相关指示,依次解复用,效果被描述为仿佛各文件的包已经复用在一起。[1] 这段定义谈的是包和时间戳的组织,本文没有据此执行文件处理。
接续从时间戳开始。文档说,第一个文件调整为从零开始,后一个文件从前一个结束的位置开始。不过,这种调整是全局进行的;如果各流的长度不完全相同,可能产生空隙。因此,“文件排在一起”与“每一路内容都没有空隙”不是同一句话。前者给出排列顺序,后者还需要各流长度的条件。
所有文件还须具有相同的流,包括相同编码、相同时间基准等。只知道两段文件扩展名一致,尚没有保留这些条件;只核过编码名称,也没有把文档所列时间基准一并说明。这个要求使接续问题超出文件名称清单,进入每段内部流的对应关系。
文件时长承担了一项直接作用:它用来调整下一文件的时间戳。文档举出按码率估算时长、文件被截断等可能导致时长不准确的情形,并说这可造成异常。它另将duration描述为能够覆盖文件内时长的信息。这里只解释该信息的角色,不给出填写或修复步骤。如果前一段的时长资料不准确,受影响的就可能包括下一段开始的位置,而不是仅让前一段的文字说明少了一个数。
入点也不必等于第一个实际解码出来的画面。Inpoint的说明说,寻址会考虑让所有流在入点能够被正常呈现。对于非帧内编码,通常会得到实际入点以前的额外包,解码内容也很可能包含入点以前的帧。较早的这些包,其时间戳可能小于该文件计算出的开始时间;若在第一文件中,还可能为负。相邻串接文件的包时间戳因此存在重叠的可能。
出点则明确采用解码时间。任何一条流到达指定解码时间,解复用器就将它视作文件结束,跳过当前及各流剩余的包;边界为排除式,不输出解码时间大于或等于出点的包。这个条件没有把解码时间改成显示时间。对于非帧内编码,额外包的显示时间仍可能位于出点以后,解码内容也可能包含出点后的帧。
流的交错程度还会影响出点附近能取得什么。文档指出,如果各流交错不够紧密,某些流在出点以前的包可能无法全部取得,可能只有最早那一路能够一直解码到出点。这是另一项范围条件,不能因清单里只写了一个共同出点,就认定每一路都提供了完全相同的末端内容。
由这些定义看,素材交接里的“接在上一段之后”至少包含文件次序、用于接续的时长信息、流的共同条件与边界时间类型。它们不是重复描述一个文件长度,而是在说明后一段的位置如何与前一段资料发生联系。本篇仅采用实际读到的3.6连续文字及邻接,未通读长文档,未运行命令,也不把文档条件当成对真实成片无缝或兼容性的保证。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。