python-3.x - 使用ffmpeg从MP4文件中仅提取Y(YUV420p)帧?

标签 python-3.x video ffmpeg mp4 yuv

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

  • 我使用命令 - ffprobe "input.mp4" -show_frames | grep 'pict_type=I' -A 1 > frame_info.txt 从视频中提取了所有 I 帧的列表。
  • 接下来,我使用 python 脚本解析这个 txt 文件以找到所有 的数字。我帧然后使用命令 - 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 帧,因为我已经从 中获得了所有 I 帧的列表。第 1 步。 .我使用的命令是 - ffmpeg -y -i input.mp4 -vf "fps=59.94" -pix_fmt gray file_name.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。

    关于python-3.x - 使用ffmpeg从MP4文件中仅提取Y(YUV420p)帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59634002/

    相关文章:

    javascript - 从数组加载 HTML5 视频播放器

    nginx - 使用 FFMPEG 将 RTMP 源重新流式传输到 YouTube - 输出中没有视频流

    c++ - 为什么 opencv videowriter 这么慢?

    Django Rest Framework 将额外的参数传递给 Serializer

    python - 行的 Pandas 最大值,前 n 最大值

    Python 套接字服务器失败

    ffmpeg - 如何使用 ffmpeg 将带有子文件夹的整个目录转换为相同的格式?

    Python:用句点(或其他字符)替换字符串中除第 n 个字母外的每个字母

    node.js - 使用 Nodejs 提供 MP4 视频文件

    wordpress - Chrome上的video.js WordPress插件仅音频(无视频)