来自 yuv422 图像的可变帧率无损视频

来自 yuv422 图像的可变帧率无损视频

最近我一直在为 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。

相关内容