我正在尋找一種方式在OS X/Python3.5中採用.avi
視頻文件,每隔100幀進行二次採樣,並將這些幀合併到其自己的視頻中。視頻採樣幀
在我的特殊情況下,視頻在20fps下30秒,因此新視頻只有6幀長(我想爲多個視頻執行此操作,然後再將它們組合在一起)。
我安裝了opencv
,但在找到關於如何執行此操作的文檔時遇到問題。如果更容易,我也可以使用不同的庫。
我正在尋找一種方式在OS X/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} ;
}
保存在您的~/.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.
謝謝這個工作很好運行單獨的每個功能。我編輯了第二個函數的路徑,所以管道可以工作,因爲它試圖進入'/./vid.avi' – Austin
不客氣!我不確定它是否會做你想做的一切,所以我真的很高興它爲你工作。它處理路徑的方式絕對可以改進,(但通常很容易)。最難理解的部分通常是'ffmpeg'使用的奧術命令... –
一般來說,通常我會把cd命令放到我想從其開始的目錄中,然後運行命令 - 這樣你就會知道它是在正確的地方工作,而不是不合需要的地方。如果你不注意它從哪裏開始,那麼在find中使用某些命令很容易造成災難。 –
簡單的邏輯與needed functions:
make
VideoCapture
VideoWriter
do
fr = cv.GrabFrame until file end
if 0 = (counter % 100)
WriteFrame(writer, fr)
也許考慮在子流程中使用'ffmpeg';我認爲'OpenCV'無論如何都需要它,所以只需剪掉中間人... –
我對任何東西都是開放的,但我必須爲成百上千的子目錄中的成千上萬的視頻執行此操作。 'ffmpeg'有什麼方法可以自動執行此操作嗎?或者一次只有一個視頻?想要使用Python,因爲我有'os'庫的一些經驗。 – Austin
在'bash'中,您可以通過'find'的幫助遞歸遍歷目錄。爲什麼你需要'Python'有一個原因嗎?是的,'ffmpeg'可以通過正確的腳本技巧輕鬆實現自動化。一個這樣的例子:http://stackoverflow.com/a/41657131/499581 –