如果视频文件太大,因为项目原因需要拆分成多个文件,如下,就可以拆分视频
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 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)))
网友评论