科技 · 实用指南
FFmpeg concat加了-safe 0仍失败?先定位出错层再加参数
保留原列表、解析后的输入地址与参数边界。合成WAV对照将文件名策略、解析、地址基准和协议许可分开检查。

concat解复用器的-safe 0允许默认策略拒绝的文件名,但不能修复损坏的列表、创建缺失文件或放行所有嵌套协议。应跟随第一条具体错误,不能只反复修改失败命令的最后一行。
修改前先保存一份完整现场
保持原媒体不变,保存实际列表文件、准确的可执行程序与构建版本、工作目录及完整stderr。记录-i接收的是普通文件、标准输入还是封装程序生成的地址。不要从手打或AI重排的日志判断文件名。
对可信本地列表,可用ffprobe -v error -f concat -safe 0 -i list.ffconcat -show_streams -of json检查,并替换实际路径。它不会生成拼接媒体。即使stdout有JSON,也要保留退出状态和stderr;空JSON不代表成功。
用普通文件基线分开策略与解析
在一份小型列表副本中只放一个已知本地输入。带空格的条目可写为file 'clip one.wav'。单引号属于列表语法;命令行列表路径外的双引号由另一个解析器处理。文件名有撇号时,应按concat文档转义。
我们用0.1秒合成WAV,在Ubuntu ffprobe 6.1.1-3ubuntu5上测试:safe 1拒绝该条目,safe 0可以打开;条目改用双引号仍失败。把列表移入子目录后,相对路径的解析地址改变,换成正确绝对路径恢复打开。这只是受控Linux观察,不是Windows或Unicode诊断。
标准输入与协议错误另开分支
若普通列表能打开而标准输入失败,应比较准确的解析地址与协议名称。我们的构建中-i -采用fd。file,pipe许可列表拒绝fd;允许实际传输协议后,相对路径或未加前缀的绝对路径仍被解析到fd之下;改为明确的file:绝对地址后才打开。
不要把这组许可列表当作通用修复。先看实际构建和原错误,只允许可信输入确实需要的协议,或保留更简单的普通列表方案。-safe 0不能解决协议拒绝。若没有检测到流,把后续map改成可选,可能只是隐藏症状,并未打开目标输入。
保留封装参数,核对正确结果
Python中,把可执行程序及每个参数分别作为subprocess.run列表元素,使用shell=False。捕获stdout、stderr及returncode,并在文字解码或换行转换前另存列表原字节。在参数列表里加shell引号,不能修复独立的concat文件语法。Windows参数转换和批处理另有文档规则。
每次只改一处,重复同一探测,确认打开的是目标输入及其流。之后再分别核验流兼容性、所需轨道与完整输出。打开后的时间戳警告属于另一项排查;探测成功或不再显示错误,都不能证明拼接正确。
