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 知识体系总览
下面这张图,把输入文件错误的三大类及其排查路径串起来了。你可以把它当作一个快速诊断地图:
2.5 实战排查步骤
遇到 No such file or directory,别慌。按这个顺序查:
- 先确认路径——用
ls -la或dir看看文件在不在 - 再确认权限——
chmod 644确保可读 - 然后看格式——
file命令走一波 - 最后测网络——
curl -I看 HTTP 头,ffprobe测 RTMP
我的经验:80% 的输入文件错误,都是路径写错了。剩下 15% 是文件损坏,只有 5% 是协议问题。所以,先检查路径,别一上来就怀疑网络。
嗯,这一章的内容就到这儿。记住,FFmpeg 的报错信息虽然看起来吓人,但只要你掌握了排查思路,大部分问题都能在 5 分钟内解决。下次遇到 No such file or directory,你就知道该从哪里下手了。