Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
Macos 视频的样本帧_Macos_Opencv_Video_Python 3.5_Subsampling - Fatal编程技术网

Macos 视频的样本帧

Macos 视频的样本帧,macos,opencv,video,python-3.5,subsampling,Macos,Opencv,Video,Python 3.5,Subsampling,我正在OSX/Python3.5中寻找一种方法来获取.avi视频文件,每100帧进行一次子采样,并将这些帧合并到自己的视频中 在我的特殊情况下,视频以20fps的速度播放30秒,因此新视频只有6帧长(我想对多个视频执行此操作,然后稍后将它们合并在一起) 我安装了opencv,但很难找到有关如何安装的文档。如果更简单的话,我也可以使用不同的库。简单逻辑: 使用ffmpeg并创建两个自定义bash函数: subsample () { export target=$2 ; find . -type f

我正在OSX/Python3.5中寻找一种方法来获取
.avi
视频文件,每100帧进行一次子采样,并将这些帧合并到自己的视频中

在我的特殊情况下,视频以20fps的速度播放30秒,因此新视频只有6帧长(我想对多个视频执行此操作,然后稍后将它们合并在一起)

我安装了
opencv
,但很难找到有关如何安装的文档。如果更简单的话,我也可以使用不同的库。

简单逻辑:


使用
ffmpeg
并创建两个自定义
bash
函数:

subsample () { export target=$2 ; find . -type f -name "*$1*" \
              -execdir bash -c 'ffmpeg -i "${0}" -vf "select=not(mod(n\,100))" \
              -vsync vfr -q:v 2 "${target}/${0}_%03d.png"' {} \; \
              -execdir bash -c 'ffmpeg -r 60 -f image2 -i "${target}/${0}_%03d.png" \
              -vcodec libx264 -crf 25 -pix_fmt yuv420p "${target}/clip_${0}"' {} \; \
              ; rm -f ${target}/*$1_*.png ;
             }

subconcat () { export target=$2 ; ffmpeg -f concat -safe 0 -i \
              <(printf "file '$PWD/%s'\n" ./clip_*.${1}) -copytb 1 \
              -c copy ${2}/combined_output.${1} ; 
             }
简介

子样本
-递归查找任何
avi
,并将每100帧合并为一个新的视频@target

subcontract
-组合指定扩展名@target的所有
剪辑*.ext
视频

假设您需要调整
ffmpeg
设置以适合您, 尽管上面的示例应该让您大致了解仅使用ffmpeg和bash find可以实现什么


谢谢,虽然我的经验有限,这可能需要很长时间,如果有的话。我尝试的第一件事,<代码> Cv2.ValoWrrist.Open[]):<代码>属性错误:'BuffTyNoFielyOrthOffice对象'没有属性“打开”<代码> @我没有Python实现的经验,所以在我的回答中添加了一个示例,页面干净整洁:)@ MBOAYBEE考虑使用<代码> FFMPEG用子过程;我认为无论怎样,
OpenCV
都需要它,所以不要再做中间人了……我对任何事情都持开放态度,但我必须为跨越数百个子目录的数以万计的视频这样做。
ffmpeg
是否有办法自动执行此操作,还是一次只执行一个视频?我想使用python,因为我对
os
库有一些经验。在
bash
中,您可以让它在
find
的帮助下递归遍历目录。您需要Python的原因是什么?是的,
ffmpeg
可以通过正确的脚本技巧轻松实现自动化。一个这样的例子:不是真的,我只是想,否则我必须学习多种不同的工具,我没有经验,比如bash/regex/ffmpeg,而且我有点时间限制,实际上这并不难,在我看来,坚持使用
Bash
简化了这个过程,因为你不依赖任何其他语言及其特性。我写了一个快速的答案。。。虽然我先有几个问题。1) 您计划创建多少个视频2)对视频进行二次采样后,您希望将其合并为一个视频3)创建视频后,您希望删除捕获的图像吗?谢谢,单独运行每个功能效果很好。我编辑了第二个函数的路径,因此管道可以工作,因为它试图进入
//vid.avi
不客气!我不确定它是否能满足你的所有要求,所以我真的很高兴它能为你工作。它处理路径的方式肯定会得到改进(但总体来说相当容易)。最难理解的部分通常是晦涩难懂的命令
ffmpeg
使用…通常作为规则,我
cd
进入我想要开始的目录,然后运行命令-这样你就会知道它在正确的位置工作,而不是不需要的地方。如果你不注意它从哪里开始,那么在
find
中使用某些命令很容易造成灾难。。。
subsample () { export target=$2 ; find . -type f -name "*$1*" \
              -execdir bash -c 'ffmpeg -i "${0}" -vf "select=not(mod(n\,100))" \
              -vsync vfr -q:v 2 "${target}/${0}_%03d.png"' {} \; \
              -execdir bash -c 'ffmpeg -r 60 -f image2 -i "${target}/${0}_%03d.png" \
              -vcodec libx264 -crf 25 -pix_fmt yuv420p "${target}/clip_${0}"' {} \; \
              ; rm -f ${target}/*$1_*.png ;
             }

subconcat () { export target=$2 ; ffmpeg -f concat -safe 0 -i \
              <(printf "file '$PWD/%s'\n" ./clip_*.${1}) -copytb 1 \
              -c copy ${2}/combined_output.${1} ; 
             }
$ source ~/.bash_profile
subsample|subconcat <ext> <target path>
subsample avi /path/to/output