Python ffmpeg连接不同fps的视频,同时保持总长度不变
我想在Python ffmpeg连接不同fps的视频,同时保持总长度不变,python,encoding,ffmpeg,mp4,frame-rate,Python,Encoding,Ffmpeg,Mp4,Frame Rate,我想在mp4视频流中插入另一个静态图像的视频剪辑,该静态图像是我使用以下方法创建的: def generate_white_vid (duration): output_filename = os.path.join(p_path,'white_vid_'+" 0:.2f}".format(duration)+'.mp4') ffmpeg_create_vid_from_static_img = 'ffmpeg -loop 1 -i /path/WhiteBackground.j
mp4
视频流中插入另一个静态图像的视频剪辑,该静态图像是我使用以下方法创建的:
def generate_white_vid (duration):
output_filename = os.path.join(p_path,'white_vid_'+" 0:.2f}".format(duration)+'.mp4')
ffmpeg_create_vid_from_static_img = 'ffmpeg -loop 1 -i /path/WhiteBackground.jpg -c:v libx264 -t %f -pix_fmt yuv420p -vf scale=1920:1080 %s' % (duration, output_filename)
p = subprocess.Popen(ffmpeg_create_vid_from_static_img, shell=True)
p.communicate()
return output_filename
我使用以下方法连接:
def concat_vids(clip_paths):
filenames_txt = open('clips_to_join.txt','w')
for clip in clip_paths:
filenames_txt.write ('file \''+ clip+'\'\n')
filenames_txt.close()
output_filename = clip_paths[0].split('.', 2)[0]
output_file_path = os.path.join(root_path, output_filename+'-padded.mp4')
# join the clips
ffmpeg_command = ["ffmpeg", "-f", "concat", "-safe", "0", "-i", "clips_to_join.txt", "-codec", "copy", output_file_path] # output_filename = ch0X-start_time-end_time
p = subprocess.Popen(ffmpeg_command)
p.communicate() # wait till the subprocess finishes. You can send commands to process as well.
return output_file_path
当我检查连接后生成的视频的长度时,我发现它不等于我连接的两个片段的总和,有时甚至更短几秒
以下是我如何以秒为单位获得视频长度:
def ffmpeg_len(vid_path):
'''
Returns length in seconds using ffmpeg
'''
ffmpeg_get_mediafile_length = ['sh', '-c', 'ffmpeg -i "$1" 2>&1 | grep Duration', '_', vid_path]
p = subprocess.Popen(ffmpeg_get_mediafile_length, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate()
length_regexp = 'Duration: (\d{2}):(\d{2}):(\d{2})(\.\d+),'
re_length = re.compile(length_regexp)
matches = re_length.search(output)
if matches:
video_length = int(matches.group(1)) * 3600 + \
int(matches.group(2)) * 60 + \
int(matches.group(3)) + float(matches.group(4))
return video_length
else:
print("Can't determine video length.")
print err
raise SystemExit
我的猜测是,可能连接统一了所有要连接的剪辑的fps
速率,如果是这种情况,如何防止这种情况发生?我怎样才能获得所需长度的视频
也许值得一提的是,要填充的视频非常短0.42秒
,原始视频是210.58
,生成的视频是210.56
我已经验证了ffmpeg确实生成了所需的填充区域,并且它具有所需的长度~
0.42
当我强制30 fps
时,我得到了一个0.43的片段,但它没有问题。1。我没有解析你的Python代码。为了让懒散的回答者更容易回答,您应该将Python代码与ffmpeg命令分开,并确认问题是否是由其中一个引起的。手动运行ffmpeg,取消脚本,然后查看是否可以重现问题。2.显示由ffmpeg\u create\u vid\u from\u static\u img
生成的实际ffmpeg命令及其控制台输出。显示其他视频的信息。3.不要通过机器解析ffmpeg控制台输出来获取持续时间:格式不标准,因此处理起来很脆弱。谢谢你的评论ffprobe
给出的长度与结果文件上的ffmpeg
的长度相同,我已验证问题不是来自白色填充段,我检查了它的长度,结果与预期的一样1。我没有解析你的Python代码。为了让懒散的回答者更容易回答,您应该将Python代码与ffmpeg命令分开,并确认问题是否是由其中一个引起的。手动运行ffmpeg,取消脚本,然后查看是否可以重现问题。2.显示由ffmpeg\u create\u vid\u from\u static\u img
生成的实际ffmpeg命令及其控制台输出。显示其他视频的信息。3.不要通过机器解析ffmpeg控制台输出来获取持续时间:格式不标准,因此处理起来很脆弱。谢谢你的评论ffprobe
给出的长度与结果文件上的ffmpeg
相同,我已验证问题不是来自白色填充段,我检查了它的长度,结果与预期一致