如果視頻文件太大,因為項目原因需要拆分成多個文件,如下,就可以拆分視頻
ffmpeg -ss [start] -t [duration] -accurate_seek -i [in].mp4 -codec copy [out].mp4
[start]:為需要截取內(nèi)容的開始時間
[duration]:為需要截取的時長
[in]:為輸入視頻文件名
[out]:為輸出視頻文件名
這種截取的好處是特別快,因為不會對視頻重新編碼,但是這種方式會導(dǎo)致:如果視頻結(jié)尾不是關(guān)鍵幀,那么視頻最后就會出現(xiàn)一段空白。
這個時候,你可以加入-avoid_negative_ts 1變成這樣:
ffmpeg -ss [start] -t [duration] -accurate_seek -i [in].mp4 -codec copy -avoid_negative_ts 1 [out].mp4
這樣截取視頻之后,時間不會精確截取,他會找到附近對關(guān)鍵幀,補全這個視頻,但是這樣也會有問題,連續(xù)分割的視頻之間存在細微的交集。
最后詳細看了下FFmpeg的文檔,如果你需要精確截取視頻,避免關(guān)鍵幀的丟失并精確截取時間,這個時候最好是重新編碼視頻。就變成這樣了:
ffmpeg -ss [start] -t [duration] -i [in].mp4 -c:v libx264 -c:a aac -strict experimental -b:a 98k [out].mp4
最后,你可以寫一段腳本,把整個視頻拆分:
import os
import json
with open("timeline.json") as f:
times = json.loads(f.read())
times = times["timeline"]
for i in range(len(times)):
start = times[i]["time"]
try:
length = times[i+1]["time"] - times[i]["time"]
except:
length = 1000
os.system('ffmpeg -ss %s -i small.mp4 -t %s -c:v libx264 -c:a aac -strict experimental -b:a 98k %s.mp4' % (start,length,str(i+1)))