我正在使用ffmpeg
剪切大文件的一部分,如下所示:
ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv
该-ss
部分工作正常,但-t
被忽略了。它正确地删除了指定的初始秒数,-ss
但随后继续使用副本进入输入的末尾。
有没有办法可以在ffmpeg
不重新编码的情况下剪掉视频的结尾?
答案1
您可以使用-ss
选项指定开始时间戳,并使用-t
选项指定编码持续时间。
下面的代码将跳过前 30 秒,然后提取接下来的 10 秒到名为 的文件中output.wmv
:
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv
在上面的命令中,时间戳以秒为单位(s.msec
),但时间戳也可以采用HH:MM:SS.xxx
格式。以下是等效的:
ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
请注意,这-t
是一个输出选项,始终需要指定后 -i
。
一些技巧:
对于较旧的 ffmpeg 版本,如果使用
-ss
after-i
,则可以获得更准确的搜索,但代价是执行速度会更慢。另请参阅:使用 FFmpeg 进行搜索您可以使用
-to
而不是-t
来指定要剪切到的时间戳。因此,-i <input> -ss 30 -t 10
您也可以使用而不是-i <input> -ss 30 -to 40
来实现相同的效果。如果您的 ffmpeg 不支持
-c
或-to
,那么它很可能已经非常过时了。编译新版本你自己或下载静态构建从他们的主页。其实并不复杂。
答案2
正如其他人提到的,将 放在-ss
之前(速度更快)或 之后(更准确)-i
会产生很大的不同。ffmpeg 搜索页面上的“快速而准确的搜索”部分告诉您如何同时获得两者,我已经使用过它,它会产生很大的不同。基本上,您将 放在-ss
之前和 之后-i
,只需确保在您想要开始剪切的地方之前留出足够的时间来获得另一个关键帧。示例:如果您想在 Video.mp4 中制作一个 1 分钟的剪辑,从 9 分 0 秒到 10 分 0 秒,您可以使用以下方法快速准确地完成:
ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4
第一次-ss
快速搜索到(大约)8分0秒,然后第二次-ss
精确搜索到9分0秒,最后-t 00:01:00
取出1分0秒的剪辑。
还请注意该页面中的这个重要点:“如果使用-ss
,-c:v copy
则生成的比特流可能会变得不连贯、无法播放或与音频流不同步,因为 ffmpeg 被迫仅在 i 帧上使用/分割。”
这意味着您需要重新编码视频,即使您只想复制它,否则可能会出现不连贯和不同步的风险。您可以先尝试一下-c copy
,但如果视频质量很差,您需要重新进行编码。
答案3
我发现两者-ss
结合起来-c copy
会导致开始时时间缩短半秒。
为了避免这种情况,您必须删除-c copy
(诚然,这将进行转码)。
答案4
使用以下格式:
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
笔记:
开始时间前输入文件是比较快的。
开始时间后输入文件是准确/精确的。