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

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

现在它工作得很好。


当前回答

我感兴趣的是基于毫秒的切割时间,并注意到秒(以及它们的分数)可以被指定为切割如下:

ffmpeg -i input.mp4 -ss 17.5 -to 20.5 output.mp4

对于持续时间而不是结束时间,使用-t而不是-to:

ffmpeg -i input.mp4 -ss 17.5 -t 3 output.mp4

其他回答

首先,视频应该使用ffvhuff编码器进行编码,以便视频可以精确地切割到开始和结束时间。通常,使用上面给出的其他命令,视频可能不会被切割到特定的持续时间,因为不是每一帧都是内部编码帧。

ffmpeg -ss 00:03:00 -i input_file.mkv -t 00:01:19 -c:v ffvhuff -pix_fmt yuv420p -y output_file.mkv

你可能在3秒时没有关键帧。因为非关键帧编码与其他帧不同,所以它们需要从前一个关键帧开始的所有数据。

使用mp4容器,可以在不使用编辑列表重新编码的情况下切割非关键帧。换句话说,如果3s之前最接近的关键帧是0s,那么它将从0s开始复制视频,并使用编辑列表告诉玩家开始播放3秒。

如果您使用的是git master的最新ffmpeg,那么在使用您提供的命令调用时,它将使用编辑列表来完成此操作。如果这对你不起作用,那么你可能使用了旧版本的ffmpeg,或者你的播放器不支持编辑列表。有些播放器会忽略编辑列表,总是从头到尾播放文件中的所有媒体。

如果您希望精确地从非关键帧开始剪切,并希望它在不支持编辑列表的播放器上从所需的点开始播放,或者希望确保剪切的部分实际上不在输出文件中(例如,如果它包含机密信息),那么您可以通过重新编码来实现,以便在所需的开始时间精确地出现关键帧。如果不指定复制,则重新编码是默认值。例如:

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

当重新编码时,您可能还希望包含其他与质量相关的选项或特定的AAC编码器。详细信息,视频请参见ffmpeg的x264编码指南,音频请参见AAC编码指南。

此外,-t选项指定持续时间,而不是结束时间。上面的命令将从3秒开始编码8秒的视频。从3s开始到8s结束,使用-t 5。如果您使用的是当前版本的ffmpeg,还可以在上面的命令中用-to替换-t以在指定的时间结束。

我感兴趣的是基于毫秒的切割时间,并注意到秒(以及它们的分数)可以被指定为切割如下:

ffmpeg -i input.mp4 -ss 17.5 -to 20.5 output.mp4

对于持续时间而不是结束时间,使用-t而不是-to:

ffmpeg -i input.mp4 -ss 17.5 -t 3 output.mp4
    ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4

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

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

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