2010-05-06 14:12:17 +0000 2010-05-06 14:12:17 +0000
357
357

使用 ffmpeg 切断视频

我使用 ffmpeg 切断一个大文件的一段视频,就像这样:

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

-ss 部分可以正常工作,但是 -t 被忽略了。

有什么方法可以使用ffmpeg来切断视频的尾部而不重新编码吗?

回答 (7)

105
105
105
2014-01-20 04:07:24 +0000

正如其他人所提到的,把-ss放在-i之前(更快)或之后(更准确)会有很大的区别。ffmpeg seek页面上的 “快速而准确的搜索 "一节告诉你如何同时获得这两点,我已经用过了,它有很大的区别。基本上你把-ss放在-i之前和-ss之后,只要确保在你要开始切割的地方之前留出足够的时间,就可以得到另一个关键帧。举个例子。如果你想做一个1分钟的片段,在Video.mp4中从9min0sec到10min0sec,你可以用

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

&001

第一个-ss求快速到(大约)8min0sec,然后第二个-t 00:01:00求精确到9min0sec,-ss取出一个1min0sec的片段。"如果你用-c:v copy-c copy一起使用,最终产生的比特流可能会很不流畅,不能播放,或者与音频流不同步,因为ffmpeg被迫只在i帧上使用/分割。”

这意味着你需要重新编码视频,即使你想只是复制视频,也要重新编码,否则会有不流畅和不同步的风险。你可以先试一下&007,但如果视频很烂,你就需要重做。

27
27
27
2014-05-09 02:24:58 +0000

我发现-ss-c copy结合在一起的结果是一开始就有半秒的剁手,为了避免这种情况,你必须把-c copy去掉(当然,这也是公认的会做个转码)。

13
13
13
2014-09-04 05:48:57 +0000

MANUALLY

在一个媒体播放器中打开文件,将文件逐帧推进,并播放一个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)

,然后用EXACT时间格式进行剪切。

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"
8
8
8
2013-05-19 03:14:56 +0000

对我来说,-t选项不起作用,但-vframes起作用了。我更喜欢使用#frames,因为我更喜欢在I-Frames上进行切割,而且我发现使用ffprobe的GOP对视频来说,我的命令行是:

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

5
5
5
2016-12-08 11:24:57 +0000

和用户225366一样,-t选项对短视频无效,但对长视频有效。对于短视频来说,-frames:v似乎更好。

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

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

0
0
0
2020-02-12 02:20:00 +0000

使用这种格式:

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

0
0
0
2019-09-01 05:29:02 +0000

我看到很多人都没有提到这一点(我不是专家,所以可能有一个陷阱),但是如果你的文件有其他的流,比如字幕和其他的元数据,比如章节等,可以用下面的命令

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

-map 0可以将文件中的所有流复制到文件中,而-c copy则可以将所有的流复制到原样。

如果你只想在剪切中保留特定的视频流(也许你不需要在文件中保留所有的音频源,或者只需要一些字幕),使用-to可以将输入的视频从开始剪切到第二段60。