FFmpeg精準時間切割視頻文件

最近有一個需求精準切割視頻剪輯,使用Python+OpenCV庫可以做到幀為單位的精準切割視頻,但是缺點是OpenCV保存的視頻是沒有聲音的,而且保存的格式也只能為avi格式,比較不方便。

所以嘗試使用FFmpeg來切割視頻,首先使用的是

ffmpeg -y -ss start -t duration -i filenam -codec copy

但是剪切出來的視頻因為視頻關鍵幀前面和後面都會多出來一部分

根據網上資料,加入了-accurate_seek參數在-i前面和-avoid_negative_ts 1參數

ffmpeg -y -ss start -t duration -accurate_see -i filename -codec copy -avoid_negative_ts 1

但是發現視頻頭部的剪裁精度基本滿意但是尾部還是不準

查閱官方說明trac.ffmpeg.org/wiki/Se

發現將-i參數放在-ss之前可以精準切割

ffmpeg -y -i filename -ss start -t duratio -codec copy

但正如官方所說,其速度非常非常非常慢……

經過查閱資料,發現ffmpeg在進行轉碼的時候會自動精準時間,即不使用-codec copy編碼。

ffmpeg -y -ss start -t duration -I filenam -c:v libx264 -perset superfast -c:a copy

視頻可以正確的剪切,但是又出現了個很嚴重的問題!

部分視頻的視頻片段較長的時候,內存佔用直接爆炸

雖然將視頻轉碼剪切視頻完成了需求,但是偶爾出現的內存佔用問題還是很麻煩的。繼續尋求別的方法。

考慮是否可以將視頻的關鍵幀設置的很短,這樣codec copy模式工作的時候便不會錯位太多了

ffmpeg -y -i filename -ss 0 -t end_of_vide -c:a copy -vcodec mpeg4 -keyint_min gop -g gop

然後用copy編碼截取視頻

ffmpeg -y -ss start -t duratio -accurate_seek -i filename codec copy -avoid_negative_ts 1

情況還是很理想的,速度和資源佔用都不算太多,儘管部分視頻的結尾大概還是會差出幾幀但是整體已經很好了。

但我還是像讓他更加精準,於是想到了一個邪魔歪道。

OpenCV截取的視頻是極為精準的但是沒有聲音。

ffmpeg進行轉碼的時候也是非常精準的,但是轉碼視頻會內存佔用很大。

那麼就用OpenCV截取視頻,ffmpeg截取音頻,然後合併音頻和視頻

使用OpenCV的VideoWriter.write寫入視頻

對視頻壓縮為音頻

ffmpeg -y -I filename -vn -ar 44100 -ac -ab 192 -f mp3

然後切割音頻

ffmpeg -y -vn -ss start -t duration -i filenam -acodec copy

最後合併音頻視頻

ffmpeg -y -i filename -i filename2 -vcode copy -acodec copy

效果驚人的很好,速度也很快……

問題基本解決。

那麼使用ffmpeg精準剪切視頻,如果電腦性能很好的話直接轉碼是最好的

1、ffmpeg -y -ss start -t duration -I filename -c:v libx264 -perset superfast -c:a copy

調整關鍵幀也是個不錯的選擇

2、ffmpeg -y - filename -ss 0 -t end_of_video -c:a 2、ffmpeg -y - filename -ss 0 -t end_of_video -c:a copy -vcodec mpeg4 -keyint_min gop -g gopcopy -vcodec mpeg4 -keyint_min gop -g gopffmpeg -y -ss start -t duratio -accurate_seek -i filename codec copy -avoid_negative_ts 1

3、不差時間的話Output seeking是很好的選擇

ffmpeg -y -i filename -ss start -t duratio -codec copy

邪魔外道法如果使用OpenCV處理的話也可以考慮……

ps: -i參數放在中間的轉碼可以規避內存爆炸的問題,但是視頻開頭會有一陣畫面定格

ffmpeg -y -ss start -i filename -t duratio -c:a copy -vcodec mpeg4 -b:v

推薦閱讀:

FFmpeg任意文件讀取漏洞分析
FFmpeg精確時間截取視頻文件
macOS 下使用 FFmpeg 推流在 B 站直播

TAG:FFmpeg | 编程 | Python |