我正在使用ffmpeg切出像这样的大文件的一部分:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv


-ss部分工作正常,但-t被忽略。它可以正确删除用-ss指定的初始指定秒数,但随后继续复制到输入的末尾。

是否可以使用ffmpeg截断视频的末尾而无需重新编码?

评论

这种语法是正确的。

stackoverflow.com/questions/18444194 / ...

#1 楼

您可以使用-ss选项指定开始时间戳记,并使用-t选项指定编码持续时间。时间戳记必须采用HH:MM:SS.xxx格式或秒数(s.msec)。

以下内容将剪切前30秒,然后剪切其后10秒的所有内容:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv


请注意,-t是输出选项,必须始终在-i之后指定。

一些技巧:


对于较旧的ffmpeg版本,如果在-ss之后使用-i,则可以得到更准确的查找,但同时会降低执行速度。另请参阅:使用FFmpeg搜索

您可以使用-to而不是-t来指定要剪切的时间戳。因此,除了-i <input> -ss 30 -t 10之外,您还可以执行-i <input> -ss 30 -to 40来实现相同的目的。
如果您的ffmpeg不支持-c-to,则可能已经过时了。自己编译一个新版本,或从其主页下载静态版本。其实并不复杂。


评论


@Mondain实际上,将-ss放在后面会获得更高的准确性。 slhck在此处blog.superuser.com/2012/02/24/…也在ffmpeg文档中提供了-ss的内容,并提到了在此之前或之后的区别。

– barlop
13-10-11在0:38

+1我来这里是为了弄清楚在前35秒后如何忽略一切,谢谢:ffmpeg -i input.wmv -c copy -t 35 output.wmv

–karlphillip
2014年9月5日19:20

这对我不起作用(mp4)。它只会产生5秒的黑屏:帧= 150 fps = 0.0 q = -1.0 Lsize = 264kB时间= 00:00:09.97比特率= 216.6kbits / s

–clocksmith
15年5月15日在18:42

这在我的视频剪辑的开头产生了3-4秒的黑屏。克里斯通过省略-c副本进行的修改消除了最初的黑屏,有关详细信息,请参见他的答案。

– joelostblom
16年4月16日在22:32

您输入“以下内容将剪切前30秒,然后剪切10秒之后的所有内容:” <-这是什么意思?剪辑是指包含? 'cos剪辑可能意味着剪辑出来。假设您的意思是包括。您是说从30秒开始,然后包括10秒?如果是这样,那么我建议您写得更清楚。

– barlop
17/12/19在2:21



#2 楼

正如其他人提到的,将-ss放在-i之前(快得多)或之后(更准确)会有很大的不同。 ffmpeg查找页面上的“快速准确查找”部分告诉您如何同时获得这两者,而我已经用过它了,这有很大的不同。基本上,您将-ss放在-i的前面和后面,只需确保在要开始切割的地方留出足够的时间,以得到另一个关键帧。示例:
如果要在Video.mp4中从9min0sec到10min 0sec制作1分钟的剪辑,则可以使用以下方法快速而准确地进行剪辑:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4


第一个-ss快速搜索到(大约)8min0sec,然后第二个-ss精确搜索到9min0sec,而-t 00:01:00提取一个1min0sec剪辑。

还要注意该页面上的这一重要点:“如果将-ss-c:v copy一起使用,则由于ffmpeg被强制仅在i帧上使用/拆分,因此最终的比特流可能最终变得断断续续,无法播放或与音频流不同步。”

这意味着即使您只想复制视频,也需要对其重新编码,否则可能会导致视频不稳定或不同步。您可以先尝试-c copy,但是如果视频无法正常播放,则需要重新执行。

评论


相同的警告适用于-c:此搜索方式的副本。

– Jiggunjer
2015年12月8日在4:10

最好的答案,这种方式对我来说效果最好。

–恩德拉Žižka
16 Mar 24 '16 at 11:04

似乎在ffmpeg 2.1+中,“-ss”现在又快速又准确,而无需指定两次。 trac.ffmpeg.org/wiki/寻求

–康拉德·迈耶(Conrad Meyer)
18-09-30在20:35

如果视频较长,则不带-c复制的剪裁速度很慢。但是,您可以先使用复制模式进行粗修,然后通过重新编码更精确地修整结果。

– danijar
19/12/16在8:24

@ConradMeyer不,不是。当我将-c复制与-​​ss一起使用时,它在输出的开头增加了7秒。

– Phani Rithvij
3月24日7:35

#3 楼

我发现-ss-c copy一起在开始时造成了半秒的斩波。

为避免这种情况,您必须删除-c copy(公认会进行转码)。

评论


还有另一个涉及准确性的答案。使用默认选项重新编码通常不是您想要的!

– Tomasz Gandor
17年10月9日在8:30

好点@TomaszGandor

–克里斯
17-10-10在9:56



我根本不理解@TomaszGandor的回复,但是删除-c复制可以解决它。

–尤里奥·奥诺弗雷
18年8月25日在16:11

如果使用-c复制,它将保留原始关键帧及其位置。开始时的“丢失时间”取决于关键帧之间的间隔。

–user1323995
19-10-16在15:44

当我将-c复制与-​​ss一起使用时,它在输出的开头增加了7秒。

– Phani Rithvij
3月24日7:23

#4 楼

手动

在媒体播放器中打开文件,该文件将逐帧前进,并播放具有以下数据的AVISynth文件:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)


然后用精确的时间格式剪切:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"




ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"


现在用视频制作一个txt文件文件,其内容如下:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'


运行ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"


评论


如果使用-c复制,它将保留原始关键帧及其位置。您的视频将被剪切为这些关键帧,因此不会,时间不准确。

–user1323995
19-10-16在15:46

#5 楼

对我来说,-t选项无效,但-vframes有效。我更喜欢使用#frames,因为我更喜欢在I帧处剪切,并且我使用ffprobe找到了视频的GOP。

对我有用的命令行是:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv


顺便说一句,将-ss放在-i的前面会大大缩短执行时间。

评论


实际上-vframes(或-frames:v)应该在-i之后,因为它是输出选项。

–slhck
13年20月20日在12:55

#6 楼

与user225366一样,-t选项不适用于短视频,但适用于较长的视频。对于短片,似乎-frames:v更好。这对我有用。

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4


如果视频有音频,则需要添加-acodec副本,如其他答案所示。

评论


但是如何根据要剪切的秒数确定多少帧?

–瑞安
4月15日23:56

#7 楼

请使用以下格式:

ffmpeg <start time> <input file> <cut duration> <out file>


例如。录制1分钟视频后,剪切60秒剪辑

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4

#8 楼

我看不到很多提及(我不是专家,所以也许有收获),但是如果您的文件包含其他流(如字幕)和其他元数据(如章节等),则可以剪切/修剪并保留所有流。以下命令
ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

使用-map 0提取文件中的所有流,并使用-c copy照原样复制所有流。
使用-to省略通过-ss的开始将剪切输入视频开始到第二十位。
如果只希望将特定的流保留在剪辑中,则map也很有用(也许您不需要文件中的所有音频源,也不需要某些字幕)。
当需要分割无法存储在FAT32存储中的大MKV文件时,可以使用此功能。