標籤:

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 細說 條件(三元)操作符

TAG:FFmpeg | Python |