FFmpeg精確時間截取視頻文件
將視頻講解切割,每張幻燈的片斷一個文件,按幻燈頁碼命名文件01.mp4,02.mp4,03.mp4……,以此類推;解析度不超過320*180像素,單聲道96kbps音質,控制每個文件尺寸不超過10M,另請發來對應的ppt文檔,用來製作成視頻與ppt同步翻頁的課程。
於是,承接前面一篇,三分屏課件製作教程,我考慮也能自動按照時間軸拆分所有視頻文件。於是得到了下面這段分割代碼。
ffmpeg -ss [start] -t [duration] -accurate_seek -i [in].mp4 -codec copy [out].mp4
[start]:為需要截取內容的開始時間
[duration]:為需要截取的時長[in]:為輸入視頻文件名
[out]:為輸出視頻文件名這種截取的好處是特別快,因為它不會對視頻重新編碼,直接截取相關時間,導出視頻,但是這種方式會導致:如果視頻結尾不是關鍵幀,那麼視頻最後就會出現一段空白。這個時候,你可以加入[-avoid_negative_ts 1]變成這樣:ffmpeg -ss [start] -t [duration] -accurate_seek -i [in].mp4 -codec copy -avoid_negative_ts 1 [out].mp4
這樣截取視頻之後,空白視頻是沒有了,但是時間不會精確截取,它會找到下一個關鍵幀,補全這個視頻,所以,導致連續分割的視頻之間存在細微的交集。
最後詳細看了下FFmpeg的文檔,如果你需要精確截取視頻,避免關鍵幀的丟失並精確截取時間,這個時候最好是重新編碼視頻。就變成這樣了:ffmpeg -ss [start] -t [duration] -i [in].mp4 -c:v libx264 -c:a aac -strict experimental -b:a 98k [out].mp4
最後,你可以寫一段腳本,把整個視頻拆分:
import osimport jsonwith 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 96k %s.mp4 % (start,length,str(i+1)))
推薦閱讀:
※python列表賦值的問題?
※構建PyQt5.8/Python2.7
※為什麼在python3里b=a=1是合理表達式,而print(a=1)卻不是。a=1為什麼沒有返回值?
※黃哥Python 細說 條件(三元)操作符