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

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

我用相机拍摄了一段视频,但不知道具体时长。我想ffmpeg保留并剪切视频的最后 7 秒。可以吗?

我尝试了以下命令:

ffmpeg -t 00:00:07 -i input.avi -vcodec copy newfile.avi

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

答案1

使用-sseof(相对于文件末尾搜索)选项。

假设你想保留最后 7 秒的数据,你可以使用:

ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4

查看文档在这里

注意:此答案于 2014 年发布,当时尚不存在此选项。它直到 2015 年才添加 — 答案自此更新。

答案2

三种不同的情况。我添加了前两种以便澄清。

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

不要使用 [-ss #],而要使用 [-sseof -#]
例如:-sseof -7

$ ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4

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

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

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

$ ffmpeg -ss 00:00:00 -to 01:32:00 -i input.mp4 -c copy output.mp4;

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

$ ffmpeg -ss 00:00:04 -t 01:00:00 -i input.mp4 -c copy output.mp4;

保留从时间戳 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`

例子:

$ 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

删除视频的最后 7 秒。

答案3

为了方便起见,这里有一个 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 处修剪 7.0 秒(输出~/Videos/input_video_Trim_7.0.mp4:)

. ~/trim_video.sh ~/Videos/input_video.mp4 7.0

相关内容