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
相同,我已验证问题不是来自白色填充段,我检查了它的长度,结果与预期一致