最近我一直在为 FFmpeg 命令行而烦恼。请注意,我不是 FFmpeg 专家。这是我的问题:
我有一堆这样的 YUV422 图像:
image0.yuv
image1.yuv
..
image450.yuv
除此之外,我还有一个包含每个图像的时间戳的文件,例如:
timestamps.txt
我想用-c:v libx264 -pix_fmt yuv422p
这些编码一个无损视频(可能带有),每个图像都以正确的时间戳显示。以下是我徒劳尝试过的方法:
使用
-f concat
并提供包含如下列表的文件:file 'image0.yuv' duration '0.0515' file 'image0.yuv' duration '0.0721' ... etc
这个解决方案不起作用,因为我需要提供一个帧大小(它不包含在原始 yuv 文件中)
类似的东西
cat *.yuv | ffmpeg -f rawvideo -s 800x600 -pix_fmt yuv422p -framerate 0.5 -i - -c:v libx264 -pix_fmt yuv422p out.mp4
也不起作用,因为我无法为每个图像提供时间戳(可变帧速率),而只是使用固定-framerate
参数我知道这个
-vsync vfr
论点,但无法让它正常工作
我将永远感激任何建议,谢谢:)
答案1
无法为 concat demuxer 指定常用输入选项。快速而粗略的解决方法:将所有 YUV 图像转换为无需指定其他选项即可读取的图像。例如:
for f in *.yuv; do ffmpeg -f rawvideo -s 320x240 -pix_fmt yuv422p -i "$f" "${f%%.yuv}.avi"; done
然后,使用 AVI 文件构建您的 concat 文件。
或者,使用 GNU parallel
:
parallel 'ffmpeg -f rawvideo -s 320x240 -pix_fmt yuv422p -i {} {.}.avi' ::: *.yuv
或者使用评论中链接的方法其中您可以传输 YUV 图像并稍后修改生成文件的 CFR 时间戳以变为 VFR。