python-3.x - 使用 fmpeg 从 MP4 文件中仅提取 Y(YUV420p)帧?
问题描述
我的主要目标是从 mp4 视频中以仅 Y(YUV 420)的形式提取第I'th、I+ 1'th (下一个)、I-1'th(上一个)帧。我现在使用的程序是
我使用以下命令从视频中提取了所有 I 帧的列表 -
ffprobe "input.mp4" -show_frames | grep 'pict_type=I' -A 1 > frame_info.txt
接下来,我使用 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 的子进程调用发生的。这对于像 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
上面代码的问题在于它只连续地将 yuv 文件附加到 yuv 文件中,但我想要一个单独的 y 文件用于一帧 mp4 视频。
我的限制是仅使用 FFmpeg,因为 FFmpeg 的 Y 值与我想要的匹配。
TL:DR - 我只想从 mp4 视频中提取 Y 部分(YUV 420p)。y 帧是第 I 帧、第 I-1 帧和第 I+1 帧。
感谢您的帮助。
解决方案
在步骤 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。
推荐阅读
- string - 将`date`命令的输出读入C脚本Unix中的变量
- python - 模块“numpy”没有属性“arrange”的错误一直在该消息中
- spring - Spring Boot - 扫描包
- audio - 当数据库级别低于阈值时,FFMPEG 可以暂停实时音频录制吗?
- pandas - 组织 csv。Python中的文件数据
- python-3.x - 跟踪图像中的白色区域
- mongodb - Mongodb shell聚合查询比较日期不返回结果
- java - 图片下载后不显示在图库中
- java - Android 应用程序中的 DropBox
- html - 如何使用 z-index 制作重叠图像的场景并保持设计响应?