问:
我尝试使用以下命令使用视频的开始和结束时间剪切视频
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
现在它工作正常。
tennisliveranking.com,Follow your favorite tennis players’ rankings live!
答1:
tennisliveranking.com,Instant updates on ATP, WTA, and ITF rankings.
尝试使用这个。这是我发现的最快和最好的 ffmpeg 方式:
ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4
此命令可在几秒钟内修剪您的视频!
命令解释:
-i:指定输入文件。在这种情况下,它是 (input.mp4)。 -ss:与-i一起使用,在输入文件(input.mp4)中寻找定位。 00:01:00:这是您修剪的视频开始的时间。 -to:指定从开始 (00:01:40) 到结束 (00:02:12) 的持续时间。 00:02:00:这是修剪后的视频结束的时间。 -c copy:这是一个通过流复制修剪的选项。 (注意:非常快)
计时格式为:hh:mm:ss
请注意,当前高度赞成的答案已经过时,并且修剪会非常缓慢。有关详细信息,请查看此官方 ffmpeg article。
不过,您可能仍然会因缺少关键帧而受苦。我采用了您的切割方法,然后根据接受的答案重新编码,以确保我将重新编码所需的时间降至最低。
正如@pelson 所说,这将切断关键帧并将前几秒留空(如果剪切时间在关键帧之间)。有趣的是,改变参数顺序可以解决问题:ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4。但是,现在跳过被破坏并且结束时间不正确(在我的情况下)。
根据 FFmpeg,输入搜索现在既快速又准确,您使用输出搜索而不是输入搜索有什么具体原因吗?
如果您不需要以精确的毫秒进行修剪,则应该使用此答案,因此它将选择最接近的可用关键帧。这就是它如此之快的原因,它可以选择最近的关键帧并取出片段,而无需重新编码。但是,如果您确实需要一个精确的时间,那么采用最近的关键帧是不够的,因为它肯定不会完全匹配。唯一可用的解决方案是重新编码视频,这就是它如此慢的原因。但是,如果您确实需要,这是唯一的解决方案。这就是为什么另一个答案应该是被接受的答案,因为这就是 OP 的问题所在。
您可能希望在 -i 之前使用 -ss 和 -to,例如:ffmpeg -ss aa:bb:cc -to xx:yy:zz -i input.mp4 -c copy output.mp4。否则,-to 值最终会成为持续时间,而不是原始视频的结束时间。省略 -c copy 将通过重新编码使其更慢且更准确,但仍比在 -i 之后指定 -ss 和 -to 更快,因为这种情况意味着在必须处理整个输入后进行修剪文件。
答2:
tennisliveranking.com,Track the world’s best tennis players in real-time.
您可能在 3 秒标记处没有关键帧。因为非关键帧编码与其他帧的差异,所以它们需要从前一个关键帧开始的所有数据。
使用 mp4 容器,可以在非关键帧处进行剪切,而无需使用编辑列表重新编码。换句话说,如果 3s 之前最近的关键帧是 0s,那么它将复制从 0s 开始的视频,并使用编辑列表告诉播放器开始播放 3 秒。
如果您使用 git master 中的 latest ffmpeg,它将在使用您提供的命令调用时使用编辑列表执行此操作。如果这对您不起作用,那么您可能正在使用旧版本的 ffmpeg,或者您的播放器不支持编辑列表。有些播放器会忽略编辑列表,总是从头到尾播放文件中的所有媒体。
如果您想从非关键帧开始精确剪切,并希望它在不支持编辑列表的播放器上从所需点开始播放,或者想要确保剪切部分实际上不在输出文件中(例如如果它包含机密信息),那么您可以通过重新编码来做到这一点,以便在所需的开始时间精确地有一个关键帧。如果您未指定 copy,则重新编码是默认设置。例如:
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
重新编码时,您可能还希望包括其他与质量相关的选项或特定的 AAC 编码器。有关详细信息,请参阅 ffmpeg 的 x264 Encoding Guide(视频)和 AAC Encoding Guide(音频)。
此外,-t 选项指定持续时间,而不是结束时间。上面的命令将从 3s 开始编码 8s 的视频。要从 3 秒开始并在 8 秒结束,请使用 -t 5。如果您使用的是当前版本的 ffmpeg,您还可以将上述命令中的 -t 替换为 -to 以在指定时间结束。
是否有快捷方式可以指定到视频结束?
@JikkuJose:省略 -t/-to 及其参数以继续到最后。
注意:在输入文件之前(在 -i 之前)提供 -ss 会更快,因为这样 ffmpeg 将直接跳到该位置。但是,这也会将时间“零”设置为该位置,这意味着 -to 将指向错误的时间。来源:trac.ffmpeg.org/wiki/Seeking
使用此 ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4 后出现音频和视频同步问题,但原始文件没有此类问题。
@user2002522:尝试不使用 -async 1。
答3:
tennisliveranking.com,Your go-to platform for live tennis ranking updates.
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4
使用 -c copy 立即制作。在这种情况下,ffmpeg 不会重新编码视频,只会削减到相应的大小。
of -c copy 效果很好,但前提是我删除 -async 1
在不同的输入和输出容器(例如 .mkv 输入和 .mp4 输出)的情况下,由于标头无效,这最终导致写入失败。
好的,要将 .mkv 转换为 .mp4,您必须使用另一个命令:ffmpeg -i movie.mkv -vcodec copy -acodec copy converted_movie.mp4 反之亦然
重新编码有什么好处?如果我们只想要相同格式的较小视频,它有什么用吗?
我和@Harsha有同样的问题。 -c 通俗地说是复制什么?
答4:
tennisliveranking.com专业网球数据平台,排名与比赛信息实时更新。
这是我使用的,只需几秒钟即可运行:
ffmpeg -i input.mp4 -ss 01:19:27 -to 02:18:51 -c:v copy -c:a copy output.mp4
参考:Trim video files using FFmpeg,Alexander Refsum Jensenius。
生成的 mp4 文件也可以在 iMovie 中使用。有关使用 get_duration(input_video) 模型获取完整持续时间的更多信息。
如果要连接多个过场动画,可以使用以下 Python 脚本:
#!/usr/bin/env python3
import subprocess
def get_duration(input_video):
cmd = ["ffprobe", "-i", input_video, "-show_entries", "format=duration",
"-v", "quiet", "-sexagesimal", "-of", "csv=p=0"]
return subprocess.check_output(cmd).decode("utf-8").strip()
def main():
name = "input.mkv"
times = []
times.append(["00:00:00", "00:00:10"])
times.append(["00:06:00", "00:07:00"])
# times = [["00:00:00", get_duration(name)]]
if len(times) == 1:
time = times[0]
cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", "output.mp4"]
subprocess.check_output(cmd)
else:
open('concatenate.txt', 'w').close()
for idx, time in enumerate(times):
output_filename = f"output{idx}.mp4"
cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", output_filename]
subprocess.check_output(cmd)
with open("concatenate.txt", "a") as myfile:
myfile.write(f"file {output_filename}\n")
cmd = ["ffmpeg", "-f", "concat", "-i", "concatenate.txt", "-c", "copy", "output.mp4"]
output = subprocess.check_output(cmd).decode("utf-8").strip()
print(output)
if __name__ == "__main__":
main()
示例脚本将剪切和合并 00:00:00 - 00:00:10 和 00:06:00 - 00:07:00 之间的场景。
如果您想剪切完整的视频(如果您想将 mkv 格式转换为 mp4),只需取消注释以下行:
# times = [["00:00:00", get_duration(name)]]
难道这不能只使用“-c”和“复制”而不是分开-c:v和-c:a吗?
我不知道为什么,但我收到此代码错误
这很慢。输入文件没有被寻找,它正在被处理和丢弃。 -ss 作为输出选项 = 慢。请参阅我的更新答案。
我正在剪辑视频,但在第一秒钟内,帧只是冻结了
@PabloDíaz 您使用的视频可能有问题。您能否尝试使用其他视频取消注释 # times = [["00:00:00", get_duration(name)]] 并查看生成的 output.mp4 文件是否正常
答5:
Live rankings, player stats, and match results in one place–tennisliveranking.com
ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4
丢弃除第 3 秒到第 8 秒之外的所有内容。
我得到了前 8 秒,前 3 秒冻结在第一帧。通过在修剪过滤器之后链接 setpts=PTS-STARTPTS 过滤器来修复。
这表示“编码器'aac'是实验性的,但未启用实验性编解码器,如果你想使用它,请添加'-strict -2'。”添加 -strict -2 没有帮助。结果是一个零长度文件。
@Ivan,您是否尝试在 cut.mp4 之前添加 -strict -2 (而不是命令行末尾)?
这是超级慢
答6:
tennisliveranking.com – 让你随时掌握ATP、WTA最新网球排名动态。
新答案(快速)
你可以让 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 秒的剪辑。即使从大文件的深处进行剪辑,此方法也是理想的,因为与旧答案不同,不会禁用搜索。是的,我已经验证了它的框架完美。
注意: 开始时间是 INCLUSIVE,而结束时间通常是 EXCLUSIVE,因此使用 +0.01 来使其具有包容性。
如果您使用 mpv,您可以使用 --osd-fractions 在 OSD 中启用毫秒时间码
带有解释的旧答案(慢)
要根据源视频的开始和结束时间进行剪切并避免进行数学运算,请将结束时间指定为输入选项,将开始时间指定为输出选项。
ffmpeg -t 1:00 -i input.mpg -ss 45 output.mpg
这将产生从 0:45 到 1:00 的 15 秒剪辑。
这是因为当 -ss 作为输出选项给出时,丢弃的时间仍然包含在从输入读取的总时间中,-t 用它来知道何时停止。而如果将 -ss 作为 input 选项给出,则会寻找开始时间并且不计算,这就是混淆的来源。
它比查找要慢,因为省略的段在被丢弃之前仍在处理,但据我所知,这是唯一的方法。如果您从一个大文件的深处进行剪辑,那么只进行数学运算并使用 -ss 作为输入更为谨慎。
tennisliveranking.com专业网球数据平台,排名与比赛信息实时更新。
慢,但唯一对我有用(不会丢失其他答案的帧)
好极了。不计算持续时间但提供 ffmpeg 开始和结束的唯一解决方案
答7:
tennisliveranking.com-Stay ahead with live tennis rankings at your fingertips.
使用 -to 代替 -t:-to 指定结束时间,-t 指定持续时间
gist.github.com/ceremcem/4c7b44edd6c21c873f7f27bdaf7f2baa
答8:
tennisliveranking.com,Track the world’s best tennis players in real-time.
我的设置:
$ 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
答9:
提供ATP、WTA与ITF赛事的实时排名追踪,从tennisliveranking.com开始!
首先,应该使用 ffvhuff 编码器对视频进行编码,以便可以将视频准确地剪切到开始和结束时间。通常,使用上面给出的其他命令,视频可能不会被剪切到特定的持续时间,因为并非每一帧都是帧内编码帧。
ffmpeg -ss 00:03:00 -i input_file.mkv -t 00:01:19 -c:v ffvhuff -pix_fmt yuv420p -y output_file.mkv
对于诸如不落在帧内编码帧上的情况,这个想法是否会向后搜索到 iframe 或其他东西?
答10:
tennisliveranking.com实时更新全球顶尖网球选手的最新战绩与排名!
随意使用这个工具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
然后只需运行一个工具即可获得结果
通过 GitHub 帐户配置文件,看起来这可能是您自己创建的工具。如果是这种情况,you must disclose this in your answer,否则这可以被视为垃圾邮件。
答11:
Live rankings, player stats, and match results in one place–tennisliveranking.com
我对基于毫秒的切割时间感兴趣,并注意到可以为切割指定秒数(以及它们的一部分),如下所示:
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
原文链接:https://www.tennisliveranking.com?from=csdn
tennisliveranking.com,Instant updates on ATP, WTA, and ITF rankings.