2017-04-08 83 views
1

我正在寻找一种方式在OS X/Python3.5中采用.avi视频文件,每隔100帧进行二次采样,并将这些帧合并到其自己的视频中。视频采样帧

在我的特殊情况下,视频在20fps下30秒,因此新视频只有6帧长(我想为多个视频执行此操作,然后再将它们组合在一起)。

我安装了opencv,但在找到关于如何执行此操作的文档时遇到问题。如果更容易,我也可以使用不同的库。

+1

也许考虑在子流程中使用'ffmpeg';我认为'OpenCV'无论如何都需要它,所以只需剪掉中间人... –

+0

我对任何东西都是开放的,但我必须为成百上千的子目录中的成千上万的视频执行此操作。 'ffmpeg'有什么方法可以自动执行此操作吗?或者一次只有一个视频?想要使用Python,因为我有'os'库的一些经验。 – Austin

+1

在'bash'中,您可以通过'find'的帮助递归遍历目录。为什么你需要'Python'有一个原因吗?是的,'ffmpeg'可以通过正确的脚本技巧轻松实现自动化。一个这样的例子:http://stackoverflow.com/a/41657131/499581 –

回答

1

使用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} ; 
      } 

保存在您的~/.bash_profile的功能。

$ source ~/.bash_profile 

简介

subsample|subconcat <ext> <target path> 

(如PWD /path/movies):

subsample avi /path/to/output 

subsample - 递归发现任何avi每100帧合并成一个全新v ideo @ target。

subconcat - 合并指定扩展@ target的所有clip_*.ext视频。

It's presumed you'll want to adjust the ffmpeg settings to suit you, although the examples above should give you a general idea of what is possible using only ffmpeg and bash find.

+1

谢谢这个工作很好运行单独的每个功能。我编辑了第二个函数的路径,所以管道可以工作,因为它试图进入'/./vid.avi' – Austin

+1

不客气!我不确定它是否会做你想做的一切,所以我真的很高兴它为你工作。它处理路径的方式绝对可以改进,(但通常很容易)。最难理解的部分通常是'ffmpeg'使用的奥术命令... –

+1

一般来说,通常我会把cd命令放到我想从其开始的目录中,然后运行命令 - 这样你就会知道它是在正确的地方工作,而不是不合需要的地方。如果你不注意它从哪里开始,那么在find中使用某些命令很容易造成灾难。 –

2

简单的逻辑与needed functions

make 
    VideoCapture 
    VideoWriter 

do 
    fr = cv.GrabFrame until file end 
    if 0 = (counter % 100) 
     WriteFrame(writer, fr) 

Python examples

+0

谢谢虽然我的经验有限,但如果有的话,这可能会让我花很长时间。我试过的第一件事,'cv2.VideoWriter.open()':'AttributeError:'builtin_function_or_method'对象没有属性'open'' – Austin

+1

@Jake我没有Python实现的经验,所以添加示例页面到我的答案 – MBo

+0

是整洁干净:) @MBo – ZdaR