使用FFMPEG剪切视频末尾3秒钟

10
我正在尝试使用FFMPEG裁剪/切掉我视频的最后3秒,但这真的是一件令人头疼的事情。
下面的代码可以裁剪,但只保留了最后3秒。我不想保留这3秒,我需要保留已删除的部分。
ffmpeg -sseof -3 -i input.mp4 output.mp4
请问有谁能帮我提供正确的代码呢?我还想请求一个批处理代码,可以自动裁剪文件夹中所有视频的最后3秒。感谢您的帮助。

标签ffmpeg的用法为:关于命令行工具的交互使用问题,请在Super User或Video Production上提问。 - greybeard
3个回答

13

使用ffmpeg剪辑视频。

使用

ffmpeg -i input.mp4 -ss 3 -i input.mp4 -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -f nut -i - -map 0 -map -0:0 -c copy out.mp4

1
这与执行 ffmpeg -i input.mp4 -ss 3 -c copy output.mp4 相同。然而,这会删除视频的尾部,但 humble5050 只想保留那一部分。 - llogan
谢谢nico_lab,这正是我在寻找的...你太棒了。 - humble5050
2
很好的回答,但能解释一下它是做什么的吗? - Phani Rithvij
1
-ss 3 是第二个输入.mp4 的输入选项。-map 1:0 -map 0 stdout,但输出 -map 1:0 被缩短了 3 秒,然后输出 -map 0 被最后的 3 秒缩短了 -shortest。-map -0:0 从 -map 1:0 中删除。如果您能阅读日语,我在 ffmpeg で先頭と後ろを一度にカットする | ニコラボffmpeg で指定時間でカットするまとめ | ニコラボ 中写过。 - nico_lab
太好了,这正是我需要的!我已经寻找这个功能数个月了。以前我只能手动输入时长。谢谢! - kohane15

7

我认为ffmpeg不允许使用“从末尾开始”的持续时间规格。你需要自己检测视频的持续时间并减去3秒。

ffprobe -i input.mp4 -show_entries format=duration -v quiet -of csv="p=0"

您可以使用脚本来完成此操作。例如在Bash中:
dur=$(ffprobe -i input.mp4 -show_entries format=duration -v quiet -of csv="p=0")
trim=$((dur - 3))
ffmpeg -t $trim -i input.mp4 output.mp4

谢谢您的回复,但不幸的是,我使用的是Windows电脑,您能告诉我如何在Windows电脑上运行它吗? - humble5050
我认为Windows批处理也允许您存储命令的输出并执行算术运算。只需使用适当的语法替换$(...)即可。 - L. Scott Johnson
一般来说,StackOverflow是一个问答平台,而不是一个代码编写服务。 - L. Scott Johnson
1
Windows批处理很糟糕,将命令输出捕获到变量的语法非常丑陋,需要使用for循环!https://dev59.com/gGw15IYBdhLWcg3w1_YN - Moss

2
这是一个方便的Bash脚本(添加到上面的答案中):
#!/bin/bash

# Arguments
FILE_RAW=$1
TRIM_EOF_DURATION=${2:-1.0} # Default is 1.0 second trimmed from EOF

# Prepare variables
BASE_PATH=$(dirname $(readlink -f $FILE_RAW))
FILENAME_EXT="$(basename "${FILE_RAW}")"
FILENAME_ONLY="${FILENAME_EXT%.*}"
EXT_ONLY="${FILENAME_EXT#*.}" # Or hardcode it like "mp4"
FILENAME_ONLY_PATH="${BASE_PATH}/${FILENAME_ONLY}"

# Trim EOF duration
INPUT_DURATION=$(ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "${FILENAME_ONLY_PATH}.${EXT_ONLY}")
OUTPUT_DURATION=$(bc <<< "$INPUT_DURATION"-"$TRIM_EOF_DURATION")
ffmpeg -i "${FILENAME_ONLY_PATH}.${EXT_ONLY}" -map 0 -c copy -t "$OUTPUT_DURATION" "${FILENAME_ONLY_PATH}_Trim_${TRIM_EOF_DURATION}.${EXT_ONLY}"

注意:将脚本设为可执行文件:chmod +x trim_video.sh 用法(输出文件:<PATH_TO_INPUT_VIDEO>_Trim_<TRIM_EOF_DURATION>.mp4
. <PATH_TO_THIS_SCRIPT>/trim_video.sh <PATH_TO_INPUT_VIDEO> <OPTIONAL_TRIM_EOF_DURATION>

示例:从 EOF 剪切 3.0 秒(输出:~/Videos/input_video_Trim_3.0.mp4
. ~/trim_video.sh ~/Videos/input_video.mp4 3.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接