Macos 视频的样本帧
我正在OSX/Python3.5中寻找一种方法来获取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
.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