2. 输入文件错误:'No such file or directory' 路径问题、文件损坏/格式不匹配、协议(HTTP/RTMP)读取失败

说实话,FFmpeg 报错里出现频率最高的,就是 No such file or directory。我刚开始用 FFmpeg 那会儿,几乎每天都要跟它打照面。你想想看,一个转码任务跑了几十分钟,最后崩在这个错误上,多让人抓狂。

但别急。这个错误其实就三大类:路径写错了、文件本身有问题、网络协议没通。咱们一个一个拆。

核心原则:FFmpeg 对输入文件的检查顺序是——先看路径是否存在,再看文件头是否可读,最后尝试协议连接。任何一个环节失败,都会抛出 No such file or directory。

2.1 路径问题:最常见的翻车现场

我个人习惯,写 FFmpeg 命令时永远用绝对路径。为什么?因为相对路径太容易出幺蛾子了。尤其是 Windows 系统,盘符、反斜杠、空格,哪个都能让你头疼半天。

来看几个典型场景:

错误写法 正确写法 说明
ffmpeg -i video.mp4 ... ffmpeg -i /data/video.mp4 ... 当前目录不确定时,用绝对路径最稳
ffmpeg -i C:\my video\test.mp4 ffmpeg -i "C:\my video\test.mp4" 路径有空格必须加引号
ffmpeg -i ./input/test.mp4 ffmpeg -i /home/user/input/test.mp4 脚本里用相对路径,换目录就炸

我的小技巧:写脚本时,先用 ls(Linux)或 dir(Windows)确认文件确实在那个位置。别凭记忆写路径,我吃过这个亏——有一次把 2023 写成了 2024,排查了半小时。

2.2 文件损坏或格式不匹配

路径对了还报错?那多半是文件本身有问题。FFmpeg 读取文件时,会先检查文件头(magic number)。如果文件头损坏,或者扩展名跟实际格式对不上,它就会告诉你找不到文件。

我记得有一次,同事拿了个 .mp4 文件给我,说转码总是失败。我一查,文件头明明是 FLV 的。说白了,就是有人把 .flv 直接改成了 .mp4 后缀。

怎么排查?用 file 命令:

# 查看文件真实格式
file suspicious_video.mp4
# 输出:suspicious_video.mp4: Flash Video

# 用 FFmpeg 强制指定格式
ffmpeg -f flv -i suspicious_video.mp4 output.mp4

注意:文件损坏的情况更隐蔽。比如下载中断、硬盘坏道,都会导致文件不完整。FFmpeg 读到损坏位置就会报 Invalid data found when processing input。这时候可以试试 -err_detect ignore_err 参数,但别指望能完全修复。

2.3 协议读取失败:HTTP/RTMP 的坑

做流媒体项目时,经常要从网络拉流。HTTP 和 RTMP 的报错,跟本地文件不一样,但错误信息还是 No such file or directory。嗯,这里要注意,FFmpeg 把网络资源也当作"文件"来处理。

常见原因就这几个:

  • URL 写错了——多一个斜杠、少一个端口,都会报错
  • 网络不通——防火墙、DNS 解析、代理设置
  • 协议不支持——比如 RTMP 需要编译时开启 --enable-librtmp
  • 超时——服务器响应太慢,FFmpeg 默认等 5 秒

我曾经在直播项目里遇到过,RTMP 流偶尔断连,FFmpeg 直接退出。后来加了重连参数才解决:

# HTTP 拉流,设置超时和重试
ffmpeg -timeout 10000000 -i http://example.com/live/stream.flv output.mp4

# RTMP 拉流,开启重连
ffmpeg -rtmp_live live -i rtmp://example.com/live/stream output.mp4

避坑指南:我曾经在调试 RTMP 时,忘了加 -rtmp_live live 参数,结果 FFmpeg 只读取了一帧就退出了。这个参数告诉 FFmpeg,这是一个直播流,不是点播文件。

2.4 知识体系总览

下面这张图,把输入文件错误的三大类及其排查路径串起来了。你可以把它当作一个快速诊断地图:

输入文件错误诊断流程图 输入文件错误诊断流程 No such file or directory 路径问题 文件损坏/格式不匹配 协议读取失败 绝对路径 vs 相对路径 空格/特殊字符 文件头损坏 扩展名与实际不符 URL 格式错误 网络/超时 快速排查清单 1. 用 ls/dir 确认文件路径是否存在 2. 用 file 命令检查文件真实格式 3. 网络资源用 curl/wget 测试可达性 4. 检查 FFmpeg 编译选项是否支持对应协议 5. 加 -v debug 参数看详细日志

2.5 实战排查步骤

遇到 No such file or directory,别慌。按这个顺序查:

  1. 先确认路径——用 ls -la 或 dir 看看文件在不在
  2. 再确认权限——chmod 644 确保可读
  3. 然后看格式——file 命令走一波
  4. 最后测网络——curl -I 看 HTTP 头,ffprobe 测 RTMP

我的经验:80% 的输入文件错误,都是路径写错了。剩下 15% 是文件损坏,只有 5% 是协议问题。所以,先检查路径,别一上来就怀疑网络。

嗯,这一章的内容就到这儿。记住,FFmpeg 的报错信息虽然看起来吓人,但只要你掌握了排查思路,大部分问题都能在 5 分钟内解决。下次遇到 No such file or directory,你就知道该从哪里下手了。