Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中访问视频每帧的像素数据_Ruby_Macos_Image Processing_Ffmpeg - Fatal编程技术网

在Ruby中访问视频每帧的像素数据

在Ruby中访问视频每帧的像素数据,ruby,macos,image-processing,ffmpeg,Ruby,Macos,Image Processing,Ffmpeg,我希望能够在Mac上用Ruby读取/传输视频,并能够访问每帧的像素数据 我试过的 它擅长将视频分割成帧,但我不知道如何在不先将每个帧保存为图像的情况下访问像素数据(或者如果可能的话) 这似乎有很大的潜力,但我认为它不再被维护,也不打算在MacOS上真正使用,所以我在那里安装它时遇到了问题(没有找到标题之类的,也没有办法配置它) 你知道我可以在这个用例中使用什么工具或方法吗?如果你有可用的ffmpeg(streamio ffmpeg只是将命令行调用包装到ffmpeg),你可以使用创

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

我试过的
  • 它擅长将视频分割成帧,但我不知道如何在不先将每个帧保存为图像的情况下访问像素数据(或者如果可能的话)



  • 这似乎有很大的潜力,但我认为它不再被维护,也不打算在MacOS上真正使用,所以我在那里安装它时遇到了问题(没有找到标题之类的,也没有办法配置它)


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

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


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

我会尝试使用ffmpeg包装器将屏幕截图写入文件流(而不是使用文件名)。然后,您可以使用任何图像库将其直接读入Ruby,避免在磁盘上保存/加载。看看streamio ffmpeg的源代码,它是一个围绕命令行的非常薄的包装器,所以它应该非常容易,包装器所做的只是使将选项传递给命令行工具变得更容易。所以我需要ffmpeg来支持这个,我不认为它支持(或者我找不到它)。它确实提供了一种将视频流输出到服务器的方法,所以我认为这可能是一种方法。。。我希望有另一个简单的库可以做到这一点。至少你可以让ffmpeg写入fifo。它会认为它是在写一个普通的文件,但你可以将它直接读入ruby。你的意思是像使用
mkfifo my_fifo
,然后让ffmpeg在这个命名管道中写入,然后“读取”我的脚本?我只是不知道如何让ffmpeg输出到这个管道中
ffmpeg-i mypic.jpg>my_fifo
只有在ffmpeg向stdout输出内容时才能工作,不是吗?如果它实际上是在内部写入mypic.jpg文件,我不知道如何更改它。如果你知道一个具体的解决方案,请让我知道。@Max发现,我只需要用谷歌搜索正确的东西,你肯定让我走上了正确的道路。谢谢(请随意发布任何与此相关的答案,我会接受)。你能详细说明一下吗?我想我理解创建命名管道并将其提供给ffmpeg,但到目前为止,我只能读回写入管道的单个屏幕截图。我似乎不知道如何说like File.open为流中的每个文件运行此块。
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 })`