用 ffmpeg 實現批量剪下視訊
一直對編輯視訊很有興趣,上大學的時候學了一些視訊剪輯的軟體,已經好久沒用了,現在也都忘的差不多了。前段時間弄了個頭條號,想發一些視訊,就又想做視訊這回事了,要不還真快忘記自己曾經做過一些小視訊了(捂臉)。其實現在想要做的視訊,不需要做很多特效,也不需要做配字幕等這些內容,所以不是很難,但是要做的量比較多,算起來要花費的時間也不算少,但是又不想在這件事上浪費太多的時間,嗯,這個時候懶的特質就該展示它的作用了。既然自己不想做,那就只好想辦法讓機器做了,於是就發現還真不是我一個人這麼懶(哈哈)。我用的是 mac,就以這個系統為例記錄一下這個過程,至於 windows 怎麼辦,自己試吧,因為我懶得試那個了。
既然是用 ffmpeg,當然第一步就是要下載 ffmpeg 。使用 Homebrew 。 Homebrew 用法
brew install ffmpeg
下載好之後就可以開始了
ffmpeg -i “input.mp4” -ss 2 -to 3 -acodec copy -vcodec copy “output.mp4”
-i ,-ss,-to 等等都是 ffmpeg 的命令,詳解可以參考這篇文章。
這樣一條命令只能操作一次,如果想要剪輯多條,這樣的命令就要重複多次,顯然不能用剪一次換個引數再輸入一次這條命令,這樣效率太差了不是我們想要的,那麼該用什麼方法呢?多次執行一個操作,我們第一個想到的就是迴圈, 但如何在終端裡迴圈呢,這又是個問題。首先想到既然要寫迴圈,那麼就需要使用一種語言來寫,面這種語言在執行時可以控制 terminal 執行迴圈裡的命令。這時就想到用 shell 來寫,shell 的教程可以參考
startTime=0
endTime=0
length=3697
i=0
while [ $endTime -le $length ]; do
#statements
i=$[$i+1]
endTime=$[$startTime+280]
ffmpeg -i /Users/dddd/Downloads/S01.E01.mp4 -ss $startTime -to $endTime -acodec copy -vcodec copy $i.mp4
startTime=$[endTime]
done
這是我寫一個每隔 280s 切割一個視訊的指令碼,一個多小時的視訊切成 14 個視訊也就只用了不到 5 分鐘,速度還是可以的,時間也很精確。對於視訊時間的問題,這幾天一直在遇到,在專案中也遇到了處理視訊的功能,有幾個功能需要根據一定的條件定位到相應的時間點去播放,但是由於視訊關鍵幀的問題,定位的時候,它總是會尋找與當前位置最近的關鍵幀,然後跳到關鍵幀的位置,這就會出現定位不準的問題,如果用過格式工廠的朋友肯定也遇到過這樣的問題,目前對於截視訊找到了這種方法,但是對於在專案中定位不準的問題還是沒能好的解決方法。在網上也找過一些資料,大多都是通過新增視訊關鍵幀的方法解決的,但這不是我想要的方法,還在尋找當中。。。