使用moviepy包(Python)的问题

问题描述 投票:0回答:2

我正在使用 moviepy 中的 ffmpeg_extract_subclip 函数来处理视频文件。但是,我得到的视频剪辑与我设置的开始时间和结束时间之间的长度不同。例如,写:

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip

clip=clip_filename
cutclip="cutvideo.avi"
ffmpeg_extract_subclip(clip_filename, 0, 10, targetname=cutclip)

我得到一个长度为 10,03 或类似的视频(就帧数而言,我得到 602 帧而不是 600 帧)。 有没有办法获得更准确的输出?

python python-3.x ffmpeg video-processing video-editing
2个回答
0
投票

嗯......我会合并this答案和

ffmpeg_extract_subclip
的实际实现(https://zulko.github.io/moviepy/_modules/moviepy/video/io/ffmpeg_tools.html#ffmpeg_extract_subclip) :

def ffmpeg_extract_subclip(filename, t1, t2, targetname=None):
        """ Makes a new video file playing video file ``filename`` between
        the times ``t1`` and ``t2``. """
    name, ext = os.path.splitext(filename)
    if not targetname:
        T1, T2 = [int(1000*t) for t in [t1, t2]]
        targetname = "%sSUB%d_%d.%s" % (name, T1, T2, ext)
    
    cmd = [get_setting("FFMPEG_BINARY"),"-y",
           "-ss", "%0.2f"%t1,
           "-i", filename,
           "-t", "%0.2f"%(t2-t1),
           "-map", "0", "-vcodec", "copy", "-acodec", "copy", targetname]
    
    subprocess_call(cmd)

因此,正如您所看到的,该库是相当无状态的,因此可以轻松扩展:

def ffmpeg_extract_subclip_precisely(filename, t1, t2, targetname=None):
    """ Makes a new video file playing video file ``filename`` between
        the times ``t1`` and ``t2``. """
    name, ext = os.path.splitext(filename)
    if not targetname:
        T1, T2 = [int(1000*t) for t in [t1, t2]]
        targetname = "%sSUB%d_%d.%s" % (name, T1, T2, ext)

    cmd = [get_setting("FFMPEG_BINARY"), "-i", filename,
           "-force_key_frames", "{}:{}".format(t1,t2), "temp_out.mp4"]

    subprocess_call(cmd)
    
    cmd = [get_setting("FFMPEG_BINARY"),"-y",
           "-ss", "%0.2f"%t1,
           "-i", "temp_out.mp4",
           "-t", "%0.2f"%(t2-t1),
           "-map", "0", "-vcodec", "copy", "-acodec", "copy", targetname]
    
    subprocess_call(cmd)
    

顺便说一句,我相信您应该尽可能以毫秒的精度指定时间。

请注意,上面的代码未经测试。


0
投票

你解决过这个问题吗?我遇到了同样的问题,我确实是@Marek 所说的并将 ffmpeg 库转换为毫秒,但是我仍然遇到同样的问题,这与编码有关吗?

© www.soinside.com 2019 - 2024. All rights reserved.