2017-04-08 80 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