首页 > 解决方案 > 使用 fmpeg 从 MP4 文件中仅提取 Y(YUV420p)帧?

问题描述

我的主要目标是从 mp4 视频中以仅 Y(YUV 420)的形式提取第I'thI+ 1'th (下一个)、I-1'th(上一个)帧。我现在使用的程序是

  1. 我使用以下命令从视频中提取了所有 I 帧的列表 -ffprobe "input.mp4" -show_frames | grep 'pict_type=I' -A 1 > frame_info.txt

  2. 接下来,我使用 python 脚本解析这个 txt 文件以查找所有I 帧的编号,然后使用命令提取所有帧 -ffmpeg -i input.mp4 -vf select='eq(n\,{1}),setpts=N/25/TB,extractplanes=y' -vsync 0 -pix_fmt gray {1}.yuv这是通过来自 python 的子进程调用发生的。

  3. 这对于像 240p 或 480p 这样的小分辨率视频来说效果很好,但是一旦我转向 1080p 视频,提取单个帧的时间就会成倍增加。当 ffmpeg 寻求该帧号来提取它时,它必须解码 mp4 文件直到该点。

我有很多 1080p 文件,我希望减少时间。我正在考虑的解决方案是从 mp4 中提取所有 Y 帧(YUV 420),然后只选择 I 帧,因为我已经从步骤 1中获得了所有 I 帧的列表。我为此使用的命令是 -ffmpeg -y -i input.mp4 -vf "fps=59.94" -pix_fmt gray file_name.yuv

TL:DR - 我只想从 mp4 视频中提取 Y 部分(YUV 420p)。y 帧是第 I 帧、第 I-1 帧和第 I+1 帧。

感谢您的帮助。

标签: python-3.xvideoffmpegmp4yuv

解决方案


在步骤 1 中,不存储帧号,而是存储 pts_time。

然后,在步骤 2 中,运行

ffmpeg -copyts -ss X -i input.mp4 -vf select='eq(t\,X),extractplanes=y' -vsync 0 -pix_fmt gray -vframes 1 {1}.yuv

其中 X 是 pts_time。


推荐阅读