【问题标题】:How to trim video by multiple frame numbers then concatenate using FFMPEG如何通过多个帧号修剪视频,然后使用 FFMPEG 连接
【发布时间】:2020-12-18 18:01:41
【问题描述】:

使用以下代码,我可以按时间修剪视频:

ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mp4

以上代码修剪 60-65 秒和 120-125 秒的视频,然后连接到 output.mp4 文件中。

需要知道如何使用frame number 和连接来修剪视频。


是否可以使用Frame Numberfps 来获取时间?

frame_1_start = 100 #Frame Number
frame_1_end   = 200 #Frame Number
frame_2_start = 450 #Frame Number
frame_3_end   = 700 #Frame Number
fps = 20 # Frame per second

time_x_1 = frame_1_start/fps
time_x_2 = frame_1_end/fps
time_y_1 = frame_2_start/fps
time_y_2 = frame_2_end/fps

ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=#{time_x_1}:#{time_x_2},setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=#{time_x_1}:#{time_x_2},asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=#{time_y_1}:#{time_y_2},setpts=PTS-STARTPTS[v1];
 [0:a]atrim=#{time_y_1}:#{time_y_2},asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mp4

【问题讨论】:

    标签: video ffmpeg


    【解决方案1】:

    trim filter documentation 所示,使用start_frameend_frame 选项。

    仅视频

    ffmpeg -i input.mp4 -filter_complex \
    "[0:v]trim=start_frame=25:end_frame=100,setpts=PTS-STARTPTS[v0]; \
     [0:v]trim=start_frame=200:end_frame=300,setpts=PTS-STARTPTS[v1];
     [v0][v1]concat=n=2:v=1:a=0[v]" \
    -map "[v]" output.mp4
    

    视频和音频

    ffmpeg -i input.mp4 -filter_complex \
    "[0:v]trim=start_frame=25:end_frame=100,setpts=PTS-STARTPTS[v0]; \
     [0:a]atrim=1:4,asetpts=PTS-STARTPTS[a0]; \
     [0:v]trim=start_frame=200:end_frame=300,setpts=PTS-STARTPTS[v1];
     [0:a]atrim=8:12,asetpts=PTS-STARTPTS[a1]; \
     [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" \
    -map "[v]" -map "[a]" output.mp4
    

    对于atrim,您可以像在原始命令中一样使用时间戳,或者如果您更喜欢使用音频样本,请使用start_sampleend_sample。 atrim 没有start_frameend_frame

    例如,如果帧速率为 25,并且您希望修剪以包含第 25-100 帧,则 atrim 将使用 atrim=1:4

    您可以使用ffprobe 获取frame ratecheck if an input has audio

    【讨论】:

    • 我只有帧号,没有时间戳。我的要求是输入是帧号数组,我必须根据帧号剪切视频并将其连接起来。
    • 是否可以使用帧数和fps来获取时间?请检查有问题的代码
    • @puneet18 您必须将帧号转换为时间戳,或将帧转换为音频样本。您必须手动执行此操作。 atrim 中没有此类选项可将视频帧转换为音频持续时间/样本。
    • 您能否建议如何将帧号转换为时间戳,或将帧转换为音频样本?还要检查有问题的代码以将帧号转换为时间戳,是否正确?
    • @puneet18 如果没有音频,它将失败。请参阅仅视频示例的更新答案以及 ffprobe 命令的链接以检查音频。
    猜你喜欢
    • 2017-08-10
    • 2015-10-27
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2016-08-19
    • 2021-09-07
    相关资源
    最近更新 更多