使用FFmpeg批量转换YUV帧为MP4视频遇文件不存在问题求助
解决FFmpeg批量转换单个YUV帧为MP4的问题
嘿,这个坑我之前踩过!FFmpeg对单个YUV帧文件的序列输入逻辑,和png、jpg这类带文件头的格式确实不一样,直接用YUV%d.yuv这种序列匹配是行不通的——因为YUV是原始无元数据的像素格式,FFmpeg默认不会把单个YUV文件识别为单独一帧,而是期望读取一个包含所有连续帧的大YUV文件。下面给你两个靠谱的解决办法:
方法一:使用concat demuxer(最灵活,适合帧数量不多的情况)
这个方法需要先做一个文本列表,告诉FFmpeg要按顺序读取哪些YUV文件:
- 创建一个名为
input.txt的文本文件,每一行对应一个YUV帧文件,格式如下:
如果YUV文件不在当前工作目录,记得写完整路径,比如file 'YUV1.yuv' file 'YUV2.yuv' file 'YUV3.yuv' ... file 'YUV15.yuv'file '/home/xxx/YUV1.yuv'。 - 执行FFmpeg转换命令:
ffmpeg -f concat -safe 0 -i input.txt -s 3840x2160 -pix_fmt yuv420p -r 30 -c:v libx264 output.mp4-f concat:指定使用concat demuxer来处理文本列表-safe 0:允许FFmpeg读取任意路径的文件(如果所有文件都在当前目录,这个参数可以省略)-s和-pix_fmt:必须明确指定,因为YUV文件没有自带尺寸和像素格式信息
方法二:先合并所有YUV帧为单个原始文件,再转换
如果你用的是Linux/macOS或者Windows命令行,可以先把所有单个YUV帧合并成一个连续的原始YUV文件,再用FFmpeg转换:
- 合并文件:
- Windows(用命令提示符):
注意:如果你的文件名是YUV1到YUV15,Windows的通配符排序可能会把YUV10排在YUV2前面,这种情况建议手动按顺序写,比如copy /b YUV*.yuv combined.yuvcopy /b YUV1.yuv+YUV2.yuv+...+YUV15.yuv combined.yuv - Linux/macOS:
用cat YUV{1..15}.yuv > combined.yuv{1..15}可以保证按数字顺序合并,避免排序问题。
- Windows(用命令提示符):
- 转换为MP4:
ffmpeg -s 3840x2160 -pix_fmt yuv420p -r 30 -i combined.yuv -c:v libx264 output.mp4
为什么你的原始命令不行?
像png、jpg这类格式,每个文件都包含文件头信息(比如尺寸、编码格式),FFmpeg可以识别单个文件为一帧,并且支持%d的序列匹配;但YUV是纯像素数据,没有任何描述信息,FFmpeg默认只会把单个YUV文件当成一整个视频流(而不是一帧),所以用YUV%d.yuv会提示找不到文件——它其实是在找一个符合这个序列模式的连续流文件,而不是多个单个帧文件。
内容的提问来源于stack exchange,提问作者Ying Wang
相关产品推荐
相关产品推荐

