我尝试使用以下命令使用视频的开始和结束时间来剪切视频

ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4

通过使用上面的命令,我想把视频从00:00:03剪辑到00:00:08。但它并没有在这两个时间之间剪切视频,而是剪切了前11秒的视频。有人能帮我解决这个问题吗?

编辑1:

我尝试使用mark4o建议的以下命令进行切割

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

但是显示了以下错误。

编码器“aac”是实验性的,但实验性编解码器未启用

因此,我在命令中添加了-strict -2,即,

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4

现在它工作得很好。


当前回答

请随意使用这个工具https://github.com/rooty0/ffmpeg_video_cutter我之前写过 这就是ffmpeg的cli前端…你只需要创建一个yaml你想要削减…就像这样

cut_method: delete  # we're going to delete following video fragments from a video
timeframe:
  - from: start   # waiting for people to join the conference
    to: 4m
  - from: 10m11s  # awkward silence
    to: 15m50s
  - from: 30m5s   # Off-Topic Discussion
    to: end

然后运行一个工具得到结果

其他回答

使用ffmpeg-python库,我这样做了。但是在安装ffmpeg-library之前,必须先卸载ffmpeg。详见我的github。 https://github.com/johntsunami/ffmpeg-python-video-trimmer/blob/main/trimmer.py

sys.path.append(r"C:\Users\johnc\Desktop\ffmpeg\bin")
stream = ffmpeg.input(r"C:/Users/johnc/Desktop/krystal.mp4",ss=57, t=55)  # ss is start time,  t IS DURATION

## SEPARATES AUDIO AND VIDEO INDEPENDENTLY BECAUSE SOMETIMES IT DOESNT HAVE AUDIO UNLESS YOU DO THIS>

audio = stream.audio 
video = stream.video   #.trim(start=60,end=115).filter('setpts','PTS-STARTPTS') ## CURRENTLY IS GOOD BUT DOESNT CUT DURATION AFTER 55 seconds

#overwrite_output overwrites it automatically if i dont want it just use output
stream = ffmpeg.output(audio, video, r'C:\Users\johnc\Desktop\output.mp4')


ffmpeg.run(stream)
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4 

立即使用-c copy for make in。在这种情况下,ffmpeg将不会重新编码视频,只是将削减到根据大小。

新答案(快速)

您可以让bash为您计算,它以毫秒为单位工作。

toSeconds() {
    awk -F: 'NF==3 { print ($1 * 3600) + ($2 * 60) + $3 } NF==2 { print ($1 * 60) + $2 } NF==1 { print 0 + $1 }' <<< $1
}

StartSeconds=$(toSeconds "45.5")
EndSeconds=$(toSeconds "1:00.5")
Duration=$(bc <<< "(${EndSeconds} + 0.01) - ${StartSeconds}" | awk '{ printf "%.4f", $0 }')
ffmpeg -ss $StartSeconds -i input.mpg -t $Duration output.mpg

这和以前的答案一样,会产生一个15秒的片段。即使是从一个大文件的深处剪切,这个方法也是理想的,因为与旧的答案不同,查找并没有被禁用。是的,我已经验证了它是完美的框架。

注意:开始时间是包含的,结束时间通常是EXCLUSIVE,因此+0.01,使其包含。

如果你使用mpv,你可以在OSD中使用——OSD -fractions启用毫秒时间码


有解释的老答案(慢)

为了根据源视频的开始和结束时间进行剪切,并避免进行数学运算,可以将结束时间指定为输入选项,将开始时间指定为输出选项。

ffmpeg -t 1:00 -i input.mpg -ss 45 output.mpg

这将产生从0:45到1:00的15秒切割。

这是因为当给出-ss作为输出选项时,丢弃的时间仍然包含在从输入读取的总时间中,-t使用它来知道何时停止。然而,如果-ss作为输入选项,则会查找开始时间而不计算,这就是造成混淆的原因。

它比寻找慢,因为省略的段在被丢弃之前仍然被处理,但据我所知,这是唯一的方法。如果从一个大文件的深处进行剪辑,那么更谨慎的做法是只做数学运算,并使用-ss作为输入。

我的设置:

$ ffmpeg
ffmpeg version 4.4 Copyright (c) 2000-2021 the FFmpeg developers
  built with Apple clang version 12.0.5 (clang-1205.0.22.9)

我发现开关的顺序很重要。 如果-i不在-ss和-t之间,那么结果中有大约3秒的空白。

所以无论你使用什么额外的开关,确保这三个开关的顺序是正确的,就像这样

ffmpeg -ss 00:00:03 -i movie.mp4 -t 00:00:08 cut.mp4
    ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4

除了第3秒到第8秒,放下所有东西。