如何使用 ffmpeg 剪切视频的最后 7 秒?

Nic*_*ame 11 video ffmpeg

我用相机拍了一段视频,但我不知道到底有多长。我想ffmpeg只保留和剪切视频的最后 7 秒。这可能吗?

我试过命令:

ffmpeg -t 00:00:07 -i input.avi -vcodec copy newfile.avi
Run Code Online (Sandbox Code Playgroud)

但它只跳过视频的前 7 秒,并显示视频翻转。

小智 11

三种不同的场景。为了澄清起见,我添加了前两个。

1 - 只想保留视频的最后 N 秒

使用 [-sseof -#] 代替 [-ss #]
示例:-sseof -7

$ ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)

保留视频的最后 7 秒并丢弃其余部分

2 - 想要删除视频的最后 N 秒并保留其余部分。(手动输入持续时间)

此选项需要手动输入结束时间(对于自动输入,请参阅 #3)
使用 -ss 和 -t (从起点开始的持续时间)或 -to (特定时间戳)
您需要为此选项手动计算结束时间。
例子:

$ ffmpeg -ss 00:00:00 -to 01:32:00 -i input.mp4 -c copy output.mp4;
Run Code Online (Sandbox Code Playgroud)

将视频从时间戳 00:00:00 保留到时间戳 01:32:00

$ ffmpeg -ss 00:00:04 -t 01:00:00 -i input.mp4 -c copy output.mp4;
Run Code Online (Sandbox Code Playgroud)

保留视频从时间戳 00:00:04 到时间戳 01:00:04
1 小时长的视频。

3 - 想要删除视频的最后 N 秒并保留其余部分。(自动检测文件的持续时间)

您需要同时使用ffmpegffprobe,但这一切都可以在终端中完成,只需很少的代码。
根据结束时间截断秒数的唯一方法是获取结束时间。我对不同长度的视频进行批量处理,因此手动查找和输入每个持续时间是不可能的。我需要自动访问持续时间值并将其传递给 ffmpeg。

神奇公式:

duration=`ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4`
duration=`bc $duration - seconds`
Run Code Online (Sandbox Code Playgroud)

例子:

$ duration=`ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4`
$ duration=`bc $duration - 7`
$ ffmpeg -ss 00:00:00 -to $duration -i input.mp4 -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)

删除视频的最后 7 秒。


slh*_*hck 9

你必须找出视频的总持续时间(或者与解析ffmpeg输出或使用其它库如的MediaInfo等),d,然后手动从该减去的时间。

假设你的视频长 40 秒,你想剪 7 秒,你只需要编码 33 秒,所以这样做:

ffmpeg -i input.avi -t 33 -c copy output.avi
Run Code Online (Sandbox Code Playgroud)


sag*_*nms 5

为了方便起见,这里有一个 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}"
Run Code Online (Sandbox Code Playgroud)

注意:使脚本可执行: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>
Run Code Online (Sandbox Code Playgroud)

示例:从 EOF 开始修剪 7.0 秒(输出:~/Videos/input_video_Trim_7.0.mp4

. ~/trim_video.sh ~/Videos/input_video.mp4 7.0
Run Code Online (Sandbox Code Playgroud)