【问题标题】:Access pixel data of each frame of a video in Ruby在 Ruby 中访问视频每一帧的像素数据
【发布时间】:2019-01-23 22:35:46
【问题描述】:

我希望能够在 Mac 上使用 Ruby 读取/流式传输视频,并能够访问每一帧的像素数据。

我尝试过的


require 'streamio-ffmpeg'
movie = FFMPEG::Movie.new("flakes.mp4")

movie.screenshot("screenshots/screenshot_%d.jpg", { custom: %w(-vf crop=60:60:10:10), vframes: (movie.duration).to_i, frame_rate: movie.frame_rate/24 }, { validate: false })`

  • https://github.com/wedesoft/hornetseye-ffmpeg

    这似乎有很大的潜力,但我认为它不再被维护了,而且它并不打算在 MacOS 上使用,所以我在那里安装它时遇到了问题(找不到标题等,没有方式来配置它afaik)。

知道我可以为这个用例使用什么工具或方法吗?

【问题讨论】:

  • 我会尝试让 ffmpeg 包装器将屏幕截图写入文件流(而不是使用文件名)。然后,您可以使用任何图像库将其直接读入 Ruby,并避免在磁盘上保存/加载。查看 streamio-ffmpeg 的源代码,它是一个非常薄的命令行包装器,所以应该很简单,
  • 包装器所做的只是使将选项传递给命令行工具变得更加容易。所以我需要 ffmpeg 来支持这一点,我认为它不支持(或者我找不到它)。它确实提供了一种将视频流式传输到服务器的方法,所以我认为这可能是要走的路……我希望有另一个简单的库可以做到这一点。
  • 至少你可以让ffmpeg写入fifo。它会认为它正在写入一个普通文件,但你可以将它直接读入 ruby​​。
  • 您的意思是使用mkfifo my_fifo,然后让ffmpeg 在这个命名管道中写入,然后从我的脚本中“读取”?我只是不知道如何让 ffmpeg 输出到这个管道中。 ffmpeg -i mypic.jpg > my_fifo 仅在 ffmpeg 将内容输出到标准输出时才有效,不是吗?如果它实际上是在内部写入文件 mypic.jpg,我不知道如何更改它。如果您知道具体的解决方案,请告诉我。
  • @Max stackoverflow.com/questions/32584220/… 原来,我只需要在谷歌上搜索正确的东西,你肯定让我走上了正确的道路。谢谢。 (请随时发布与此相关的任何答案,我会接受)。

标签: ruby macos image-processing ffmpeg


【解决方案1】:

如果您有可用的 ffmpeg(streamio-ffmpeg 只是包装对 ffmpeg 的命令行调用),您可以使用 File.mkfifo 创建一个命名管道,并让 ffmpeg 将其屏幕截图写入该管道。

然后像打开任何普通文件一样在 Ruby 中打开管道,您可以直接从 ffmpeg 读取屏幕截图图像,而无需将它们传输到磁盘或从磁盘传输。使用您选择的 Ruby gem 解析像素数据。

【讨论】:

  • 您能详细说明一下吗?我想我理解创建命名管道并将其提供给 ffmpeg,但到目前为止,我只能读回写入管道的单个屏幕截图。我似乎不知道怎么说 File.open 为流中的每个文件运行这个块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多