获取视频长度:
def getLength(input_video):
cmd = 'ffprobe -i %s -show_entries format=duration -v quiet -of csv="p=0"' % input_video
output =os.popen(cmd,'r')
output = output.read()
return output
ffmpeg 剪切视频片段:
def cut_video(input,output,start,end):
tlong=end-start
cmd = 'ffmpeg -y -ss {} -t {} -accurate_seek -i {} -codec copy -avoid_negative_ts 1 {} '.format(start,tlong,input,output)
subprocess.call(cmd, shell=True)
Notes:-y 默认视频重写
基本剪切方式 ' ffmpeg -i test.mp4 -ss 10 -t 15 -codec copy cut.mp4 '
-i : source
-ss:start time
-t :duration
-c :video,audio codec
剪切后的视频,
1)剪切时间点不精确
2)剪切的视频有黑屏
参数优化方式
(1) 将-ss, -t 参数放在-i参数之前
'ffmpeg -ss {} -t {} -i {input} -codec copy {output} '
(2)-accurate_seek 剪切时间更加精确
accurate_seek必须放在-i参数之前
(3)avoid_negative_ts 寻找结尾时关键帧进行补全
如果编码格式采用的copy 最好加上 -avoid_negative_ts 1参数
加上该参数可能会出现一个问题,会直接从头截到ss+t的时刻。
替代精准剪切方式2:
def cut_video(input,output,start,end):
tlong=end-start
#cmd = 'ffmpeg -y -ss {} -t {} -accurate_seek -i {} -codec copy -avoid_negative_ts 1 {} '.format(start,tlong,input,output)
cmd = 'ffmpeg -y -ss {} -t {} -accurate_seek -i {} -async 1 -strict -2 {} '.format(start,tlong,input,output)
subprocess.call(cmd, shell=True)
转换视频
ubuntu无法打开mpeg 的.mp4视频,在处理这些视频重新对视频进行编码
cmd = "ffmpeg -y -i {} -r 30 {}".format(invideo, outvideo)
这里invideo outvideo必须是绝对路径。如果是os.path.join(dir,vname)则会无法找到输出路径。
图片合成视频且不丢帧
ffmpeg -start_number 178 -i 2testnp/%d.jpeg -b:v 5626k -framerate 40 -vcodec mpeg4 2testnp.mp4
参考文献
https://blog.csdn.net/matrix_laboratory/article/details/53157383
python中使用ffmpeg进行视频指定时长截断(解决剪切后音视频不同步的问题)