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
但是發現視頻頭部的剪裁精度基本滿意但是尾部還是不準
查閱官方說明http://trac.ffmpeg.org/wiki/Seeking
發現將-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 站直播